求TypeScript正则:匹配引号外连续2+空格及推荐npm解析库
解决方案
一、TypeScript正则表达式实现
要匹配并移除引号外的连续多空格,核心思路是优先匹配引号内的内容(原样保留),再匹配引号外的连续2个及以上空格(替换为单个空格)。
基础版本(适用于无转义引号的场景)
const input = `"John Smith" and Sarah Brown are having 'a ' nice(" . ") day tod' 'ay.`; const regex = /(".*?"|'.*?'|(\s{2,}))/gs; const output = input.replace(regex, (match, quotedContent) => { // 匹配到引号内内容则直接保留,否则将多空格替换为单个空格 return quotedContent ? match : ' '; }); console.log(output); // 输出:"John Smith" and Sarah Brown are having 'a ' nice(" . ") day tod' 'ay.
健壮版本(支持引号内的转义字符)
如果需要处理引号内包含转义引号的场景(比如"He said \"Hi!\""),可以使用更严谨的正则:
const robustRegex = /("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|(\s{2,}))/gs; const robustOutput = input.replace(robustRegex, (match, quotedContent) => { return quotedContent ? match : ' '; });
二、推荐的词法分析/解析npm库
如果你的场景涉及更复杂的文本结构(比如嵌套引号、多种字符串格式、自定义语法),正则的局限性会显现,此时词法分析库是更可靠的选择,你找到的lexing类库完全适用。以下是几个适合的库:
- lex:轻量级词法分析器,支持自定义token规则,可轻松定义"引号内文本"和"空格"等token类型,遍历token时仅处理外部空格即可,TypeScript可通过
@types/lex获取类型支持。 - pegjs:PEG解析器生成器,允许编写自定义语法规则解析带引号的文本,适合需要处理复杂语法逻辑的场景。
- string-parser:专门针对带引号、转义字符的字符串解析,体积小、API简单,适合轻量级场景。
- acorn:JavaScript/TypeScript解析器,虽主打代码解析,但也能用于处理复杂字符串结构,适合需要兼容多种字符串格式的场景。
内容的提问来源于stack exchange,提问作者DrChoppy
相关产品推荐
相关产品推荐

