所有空格的正则表达式,除非它在引号中

时间:2015-01-28 13:59:09

标签: regex

我正在寻找匹配字符串中所有空格的正则表达式,除非它在引号之间。

例如,如果我有以下字符串:

 abc  def  " gh i " jkl  " m n o p " qrst  
-   --   --        -   --           -    --

我想匹配下面有破折号的空格。破折号不是字符串的一部分,仅用于说明目的。

可以这样做吗?

3 个答案:

答案 0 :(得分:3)

[ ](?=(?:[^"]*"[^"]*")*[^"]*$)

试试这个。看看演示。

https://regex101.com/r/pM9yO9/7

这基本上说明找到任何space前面有""组但不是"的组{。}。lookahead强制执行。{/ p} >

答案 1 :(得分:2)

您可以尝试使用以下正面预测的正则表达式。

\s(?=(?:"[^"]*"|[^"])*$)

 (?=(?:"[^"]*"|[^"])*$)

DEMO

<强>解释

  • \s匹配空格字符

  • (?=(?:"[^"]*"|[^"])*$)仅在后面跟着

    1. "[^"]*"双引号加[^"]*任何不是双引号的字符零次或多次加上结束双引号。所以它匹配双引号块,例如"foo""ljilcjljfcl"

    2. |或者如果以下字符不是双引号,则控件切换到|或部分旁边的模式,即[^"]

    3. [^"]匹配任何字符,但不匹配双引号。

foo "foo bar" buz作为示例字符串。

foo "foo bar" buz             

\s首先匹配所有空格。然后它检查匹配的空格必须后跟双引号字符串或[^"]零次或多次的条件。因此它会检查第一个空格是否后跟双引号字符串。是的,第一个空格后跟双引号字符串"foo bar",然后双引号字符串后面的字符是空格。现在正则表达式"[^"]*"失败了,控件切换到下一部分,即 [^"]。此模式与以下空间匹配。由于*适用于该模式[^"]*匹配以下所有字符。最后,第一个空间满足条件,因此匹配。

答案 2 :(得分:2)

如果您的正则表达式是PCRE可以(*SKIP)(*F)引用的内容或替换一个或多个\s

"[^"]*"(*SKIP)(*F)|\s+

Test at regex101.com