正则表达式忽略捕获的中间部分

13
我想要一个正则表达式,应用于 "firstsecondthird" 时能够匹配 "firstthird"(在单个分组中,即在C#中Match.Value等于"firstthird")。
这是否可能?我们可以忽略前缀或后缀,但如何处理中间部分?

1
为什么您要将其限制为必须是单个组?我认为这是不可能的。 - Mark Peters
只是想知道是否可能,如果可以的话会更容易。如果不行,我会选择替换,没有问题。 - Valentin Kuzub
4个回答

8

匹配以'first'开头,中间有零个或多个字符,最后以'third'结尾的字符串。这是您的意思吗?

"^first(.*)third$"

您是指如果找到字符串“firstsecondthird”,是否放弃除“first”和“third”之外的所有内容?

replace("^(first)second(third)$", "$1$2")

我相信你需要匹配firstsecondthird,而不是firstthird,这不是你想要的。你需要使用正则表达式替换吗? - Valentin Kuzub
不,它也将匹配firstthird。 .*表示零个或多个,因此在“second”的位置上不需要任何内容。 - duncan
是的,效果应该像你示例中的替换一样,但我想知道是否可能不使用替换来实现,因为我们没有重新排序任何内容,我认为可能有一种方法。 - Valentin Kuzub

8

不,没有办法从目标字符串中创建包含非连续文本的单个匹配组。您需要使用replace或将匹配组粘合在一起形成一个新字符串。


2
据我所知,使用单个正则表达式无法实现此功能。您需要按照以下方式调用replace();进行替换:
String inputVar = "firstsecondthird";
String resultVar = Regex.replace(inputVar, "^(first)second(third)$", "$1$2");

可以根据需要将其插入到表达式中的内容(通常...)。

-1

我知道这个问题几年前提出过,但是为了那些仍然在寻找答案的人,有一种方法,不同于其他回答,可以排除中间的某一部分,只使用一个表达式。

诀窍是使用“非捕获组”。这个特性允许使用包括一个组的表达式来搜索,但是该组不包括在结果中。

其语法如下:

(?:Groups Contents)

这将与表达式的其余部分匹配,但该组将从返回结果中排除。

例如,如果您将以下表达式应用于由换行符分隔的名称列表,则:

\w{2,} (?:Micheal |James )\w{2,}

它将匹配每个名字包含“Micheal”或“James”的人,但只返回他们的名字和姓氏。

在以下列表中,匹配项以斜体显示,返回文本以粗体显示:

  • Duke Jamesson

  • Bob James

  • Bob Micheal Jones

  • James Anderson

  • Joseph Micheal Hetton

  • Bill James Johnson

  • George Ronald McCarthy


2
你不能在匹配过程中排除其中的一部分 - 好吗。这个答案是错误的。请参阅 triplee 的帖子,那才是这个问题的真正答案。duncan 的回答 是一个 解决方法,并不总适用于所有情况。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接