首页 > 解决方案 > 当我有一个单引号前面有一个空格时,如何不允许匹配正则表达式?

问题描述

如果引号的开头前面有一个空格,我想在我有奇数个引号时不匹配。在嵌套引号的情况下,只考虑最外层的引号。前任。

请不要“打开”灯。->这不应该匹配

请不要打开“灯”。->这应该匹配“灯”

我已经完成了直到匹配引号

((?!^)(\s)".*?[\s]*"+)|(^".*?[\s]*"+)

示例测试用例。

打开“Light A”和“Light B”->匹配light A和light B

“Light A”已打开 -> 匹配 Light A

她回答“如你所说”-> 不匹配

她回答“如你所说” -> 匹配“如你所说”

请不要打开“灯”。-> 这不应该匹配

请不要“打开‘灯’。->这不应该匹配

她回答“请打开'Light A'” -> 比赛请打开灯A

请不要“打开”灯。->这不应该匹配

标签: javascriptregex

解决方案


要替换"..."JS 中前后没有空格的子字符串,您可以使用

.replace(/(\s|^)".*?"(?!\S)/g, '$1<REPLACEMENT_HERE>')

或者,匹配任何字符,包括换行符:

.replace(/(\s|^)"[^]*?"(?!\S)/g, '$1<REPLACEMENT_HERE>')

或者,如果您只针对最新的 ECMAScript 兼容 JS 环境,请使用

.replace(/(?<!\S)".*?"(?!\S)/g, '<REPLACEMENT_HERE>')

查看正则表达式演示

细节

  • (\s|^)- 第 1 组:空格或字符串开头
  • "- 一种"
  • .*?- 尽可能少的除换行符以外的任何 0+ 字符
  • "- 一种"
  • (?!\S)- 空格或字符串结尾应该跟在当前位置之后。

(?<!\S)最后一个示例中,是一个否定的lookbehind,它匹配一个没有紧跟在非空白之前的位置,目前大多数浏览器不支持。


推荐阅读