好吧所以我有一个输入,其中包含几个被双引号“word”或法语引号“word”包围的序列
问题是,法语引号必须在两边都有一个空格将单词与引号分开。
所以我必须在单词的开头匹配(“)或(«)。
现在,我有这个:
(« |“)([^»”]+)( »|”)
我希望我的中间单词是我唯一的输出,但使用这种技术我得到三个输出($ 1,$ 2和$ 3),只有第二个是相关的。
所以我正在寻找一种不使用括号的方法。
答案 0 :(得分:3)
你的正则表达式有两个问题:
超过1个捕获组(这是您要问的问题)这可以通过使用非捕获组来解决
(?:« |“)([^»”]+)(?: »|”)
所以你只有1个捕获组$1
,其中包含你想要的单词
匹配«hello”
之类的内容。这有点棘手。您可以使用正面期待来确保引号成对出现:
(?=«.*»|“.*”)(?:« |“)([^»”]+)(?: »|”)
检查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