正则表达式多引号选择

时间:2014-06-06 10:48:46

标签: regex string double quotes

我试图从一个大字符串中提取子字符串。 提取的子字符串应遵循以下规则: 1.两个双引号之间(例如:"你好\" jonathan \"你好吗")将提取" jonathan" (没有双引号)。

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

  2. 当单引号被双引号括起时,它被视为常规字符。 (例如:"你好" Jonathan''''""""")今天")将提取这个子字符串:" Jonathan'''' 39;" - 没有双引号。

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

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

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

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

    它确实提取

    Jon'hello'athan
    

    但是当我添加类似的东西时:

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

    到模式,它像整个模式一样对待它

    ([\'])|[\"])
    
    你会推荐什么? 谢谢

1 个答案:

答案 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

测试live on regex101.com