正则表达式多引号选择

Posted

技术标签:

【中文标题】正则表达式多引号选择【英文标题】:regex multiple quotes selection 【发布时间】:2014-07-27 14:46:22 【问题描述】:

我正在尝试从一个大字符串中提取子字符串。 提取的子字符串应遵循以下规则: 1. 在两个双引号之间(例如:"hello \"jonathan\" how are you")会提取"jonathan"(不带双引号)。

    与 1 相同,只是用单引号。

    当单引号被双引号包围时,它被视为常规字符。 (例如:“Hello "Jonathan how 'are'" you today")会提取这个子字符串:“Jonathan how 'are'”——不带双引号。

我一直在尝试许多涉及这种模式的组合:

Pattern p1 = Pattern.compile("([\"]*[\']*[\']*[\"])");

这个解决了一个问题(数字 3),在这个例子中:

String s = "Hello \"Jon\'hello\'athan\" how are 'you'"

它确实提取了

Jon'hello'athan

但是当我添加类似:

([\'])|[\"])

对于模式,它把它当作整个模式来对待

([\'])|[\"])

你会推荐什么? 谢谢你

【问题讨论】:

【参考方案1】:

只要您不需要处理转义引号,并且只要您的所有引号都正确平衡,您就可以使用negative lookahead assertion:

(['"])((?:(?!\1).)*)\1

或者,在 Java 中:

Pattern p1 = Pattern.compile("(['\"])((?:(?!\\1).)*)\\1");

说明:

(['"])   # Match any quote character, capture it in group 1
(        # Match and capture in group 2:
 (?:     # Start of non-capturing group that matches...
  (?!\1) #  (as long as it's not the same quote character as in group 1)
  .      # ...any character
 )*      # any number of times.
)        # End of capturing group 2
\1       # Match the same quote as before

测试它live on regex101.com。

【讨论】:

感谢您这么快回答。它实际上对我不起作用......这就是我运行这个时得到的:Jon'hello'athan" 我想 @user3454745:您需要获取Matcher 对象的第二组(在对其执行.find() 之后):myMatcher.group(2) 将包含Jon'hello'athan

以上是关于正则表达式多引号选择的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 单引号或双引号 -C#

正则表达式用于选择花括号内的双引号而忽略外部的引号

Javascript正则表达式获取双引号内容

Bigquery 正则表达式 - 删除双引号中的逗号

php用正则表达式怎么取双引号里面的内容??

正则表达式删去双引号vscode