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

本文关键字:中间部 正则表达式 | 更新日期: 2023-09-27 18:11:11

我想要一个单一的正则表达式,当应用于:"firstsecondthird"将匹配"firstthird"(在单个组中,即在c# Match.Value将等于"firstthird")。

这可能吗?我们可以忽略后缀和前缀,但是中间呢?

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

匹配以'first'开头,包含零个或多个其他字符,然后以'third'结尾的字符串。你是这个意思吗?

"^first(.*)third$"

或者,你的意思是如果你找到一个字符串'firstsecondthird',除了'first'和'third'之外的所有内容都删掉?

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

不,没有任何工具可以使单个匹配组包含来自目标字符串的不连续文本。您需要使用replace,或者将匹配的组粘合到一个新字符串中。

当然,这是不可能用单个正则表达式完成的。您必须按如下方式调用replace();:

String inputVar = "firstsecondthird";
String resultVar = Regex.replace(inputVar, "^(first)second(third)$", "$1$2");

可以在必要时插入到表达式中

我知道这个问题是在几年前的这个时候问的,但是为了那些仍然来这里寻找答案的人,有一种方法,不像任何其他答案,它会排除中间只有一个表达式的部分。

技巧是使用"非捕获组"。此功能允许使用包含未包含在结果中的组的表达式进行搜索。

语法如下:

(?:Groups Contents)

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

。如果将以下表达式应用于以换行符分隔的名称列表,

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

它将匹配每个中间名为' michael '或'James'的人,但只返回他们的姓和名。

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

    杜克Jamesson
  • 鲍勃·詹姆斯

  • 鲍勃迈克尔琼斯

  • 詹姆斯安德森

  • 约瑟夫迈克尔 Hetton

  • 比尔詹姆斯约翰逊

  • George Ronald McCarthy