正则表达式匹配一个字符或两个不同的字符,两边都相同

时间:2017-05-15 01:20:08

标签: regex

好吧所以我有一个输入,其中包含几个被双引号“word”或法语引号“word”包围的序列

问题是,法语引号必须在两边都有一个空格将单词与引号分开。

所以我必须在单词的开头匹配(“)或(«)。

现在,我有这个:

(« |“)([^»”]+)( »|”)

我希望我的中间单词是我唯一的输出,但使用这种技术我得到三个输出($ 1,$ 2和$ 3),只有第二个是相关的。

所以我正在寻找一种不使用括号的方法。

3 个答案:

答案 0 :(得分:3)

你的正则表达式有两个问题:

  1. 超过1个捕获组(这是您要问的问题)这可以通过使用非捕获组来解决

    (?:« |“)([^»”]+)(?: »|”)
    

    所以你只有1个捕获组$1,其中包含你想要的单词

  2. 匹配«hello”之类的内容。这有点棘手。您可以使用正面期待来确保引号成对出现:

    (?=«.*»|“.*”)(?:« |“)([^»”]+)(?: »|”)
    
  3. 检查regex101中的演示:https://regex101.com/r/OD10hz/1

    编辑:经过深思熟虑之后,似乎还有一个更容易的选择:

    (?<=« ).*(?= »)|(?<=“).*(?=”)
    

    匹配(\0)本身就是你要找的。添加对其他报价对类型的支持也更容易,并且它正确匹配“A»B”之类的内容。

答案 1 :(得分:1)

在许多正则表达式中(您没有指定您正在使用的内容),语法支持非捕获组,通常以(?:开头并以)结尾:

(?:« |“)([^»”]+)(?: »|”)

另外,请注意您的正则表达式会错误地匹配

等字符串
“Hello! »
« Bonjour!”

答案 2 :(得分:0)

具体而有效。

使用紧凑,快速,具体的正则表达式,如果这是您需要的

(?<=«|« |"|" )word(?=»| »|"| ")

这应该这样做。简单的外观可以解释单个空格。易于修改。你所看到的就是你得到的。

  • (?<=«|« |"|" ) - 不要归还此(4种可能性的正面观察),但要用它来匹配
  • word - 要返回的字词
  • (?=»| »|"| ") - 不要回复此(4种可能性的正向前瞻),但要用它来匹配

此处涉及 分组

This string     Returns This as \0 (or $0)
-----------     --------------------------
"word"              word
"word "             word
" word"             word
" word "            word
«word»              word
«word »             word
« word»             word
« word »            word