我正在寻找匹配字符串中所有空格的正则表达式,除非它在引号之间。
例如,如果我有以下字符串:
abc def " gh i " jkl " m n o p " qrst
- -- -- - -- - --
我想匹配下面有破折号的空格。破折号不是字符串的一部分,仅用于说明目的。
可以这样做吗?
答案 0 :(得分:3)
[ ](?=(?:[^"]*"[^"]*")*[^"]*$)
试试这个。看看演示。
https://regex101.com/r/pM9yO9/7
这基本上说明找到任何space
前面有""
组但不是"
的组{。}。lookahead
强制执行。{/ p} >
答案 1 :(得分:2)
您可以尝试使用以下正面预测的正则表达式。
\s(?=(?:"[^"]*"|[^"])*$)
或
(?=(?:"[^"]*"|[^"])*$)
<强>解释强>
\s
匹配空格字符
(?=(?:"[^"]*"|[^"])*$)
仅在后面跟着
"[^"]*"
双引号加[^"]*
任何不是双引号的字符零次或多次加上结束双引号。所以它匹配双引号块,例如"foo"
或"ljilcjljfcl"
|
或者如果以下字符不是双引号,则控件切换到|
或部分旁边的模式,即[^"]
。
[^"]
匹配任何字符,但不匹配双引号。
以foo "foo bar" buz
作为示例字符串。
foo "foo bar" buz
\s
首先匹配所有空格。然后它检查匹配的空格必须后跟双引号字符串或[^"]
零次或多次的条件。因此它会检查第一个空格是否后跟双引号字符串。是的,第一个空格后跟双引号字符串"foo bar"
,然后双引号字符串后面的字符是空格。现在正则表达式"[^"]*"
失败了,控件切换到下一部分,即
[^"]
。此模式与以下空间匹配。由于*
适用于该模式[^"]*
匹配以下所有字符。最后,第一个空间满足条件,因此匹配。
答案 2 :(得分:2)