正则表达式匹配带空格的字符串

时间:2015-06-15 19:20:30

标签: regex spaces double-quotes

我想找到一个与包含空格的引号包围的字符相匹配的正则表达式

尝试的例子:

adb shell am startservice -n fooApp/barService -a INVOKE --es "key" "key1" --es "value" "value 2 has spaces"

只会在"value 2 has spaces"

上匹配一次

到目前为止,我已经得到了这个

"([^"](?<=\s)[^"]*)"

但它匹配 " "key"之间以及"key1value""value之间的" --es " ...

我觉得我很接近,但却错过了一些关键的东西。

4 个答案:

答案 0 :(得分:2)

您可以使用此模式并仅提取组1的非空值:

"[^" ]*"|("[^"]*")

答案 1 :(得分:1)

您可以使用此正则表达式:

(?:"[^"\s]*"[^"]*)*("\S*\s[^"]*")

并抓住被捕获的组#1

RegEx Demo

答案 2 :(得分:0)

您可以使用此正则表达式:

"[^"\s]+[\s]+[^"]*"

Demo

如果你想确保"value.."有一个前面的空格,not matched "value ...",那么请改用它:

(?<=\s)"[\w]+[\s]+[\d\w\s]*"

Demo

答案 3 :(得分:0)

您无法验证配对引号的整个字符串 你唯一能做的就是验证配对(平衡)
直到你要找的引用字符串。

你必须强制引擎遵守,即。不要仅仅向前跳过 找到匹配。

您可以强制引擎执行此操作的唯一方法是使用\G
锚构造。它使引擎匹配位于
的位置 最后一场比赛没有结束,否则它迫使它失败,停止匹配 完全。

这将实现 -

\G[^"]*(?:"[^"\s]*"[^"]*)*("[^"\s]*\s[^"]*")

但是,如果引擎不支持\G构造,则其他方式有 要使用的。

 \G                # This MUST match where last match left off
 [^"]*             # Up to the next "
 (?:               # Absorb balanced, non space quotes
      " 
      [^"\s]* 
      " 
      [^"]* 
 )*
 (                 # (1 start), The quotes with spaces.
      "
      [^"\s]* 
      \s 
      [^"]* 
      " 
 )                 # (1 end)