我想在命名组中捕获字符串。第二个字符串是可选的。如果此可选字符串丢失,则我的正则表达式代码无效。
(?<entry1>string1) (?<entry2>string2)? (?<entry3>string3)
如何使第二个字符串可选?
答案 0 :(得分:0)
如果我删除“?”在每个组的开头(它们代表什么?https://www.regextester.com/不接受它们),您的表达式适用于以下字符串:
<entry1>string1 <entry3>string3
<entry1>string1 <entry2>string2 <entry3>string3
您的正则表达式的问题是,您可以省略第二个组表达式<entry2>string2
,但不能省略该组后面的空格。以下正则表达式字符串可能会按您期望的方式工作。
(<entry1>string1) (<entry2>string2?) ?(<entry3>string3)
(<entry1>string1) ((<entry2>string2) )?(<entry3>string3)
第二个字符串可能更适合您的需求,但具有更多的组表达式。根据您是否真的需要空间,可以微调正则表达式。
答案 1 :(得分:0)
我不明白您为什么使用?在每个捕获组的开头。 ?表示先前匹配出现0或1次,在这种情况下不表示任何意义。正如@Werner Henzer提到的那样,您可能在空格方面遇到了问题。 我的解决方案如下所示:
(<entry1>string1)\s*?(<entry2>string2)?\s*?(<entry3>string3)
强制匹配组1和3,组2是可选的,并允许以惰性模式使用组之间的空格。