我试图从一个大字符串中提取子字符串。 提取的子字符串应遵循以下规则: 1.两个双引号之间(例如:"你好\" jonathan \"你好吗")将提取" jonathan" (没有双引号)。
与1相同,只是单引号。
当单引号被双引号括起时,它被视为常规字符。 (例如:"你好" Jonathan''''""""")今天")将提取这个子字符串:" Jonathan'''' 39;" - 没有双引号。
我一直在尝试涉及这种模式的许多组合:
Pattern p1 = Pattern.compile("([\"]*[\']*[\']*[\"])");
这个解决了一个问题(num 3),在这个例子中:
String s = "Hello \"Jon\'hello\'athan\" how are 'you'"
它确实提取
Jon'hello'athan
但是当我添加类似的东西时:
([\'])|[\"])
到模式,它像整个模式一样对待它
([\'])|[\"])
你会推荐什么?
谢谢
答案 0 :(得分:3)
只要您不需要处理转义引号,并且只要所有引号都正确平衡,您就可以使用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