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

时间:2011-10-14 13:28:44

标签: c# regex

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

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

4 个答案:

答案 0 :(得分:4)

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

"^first(.*)third$"

或者,你的意思是,如果你找到一个字符串'firstsecondthird',那么除了'first'和'third'之外的其他东西?

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

答案 1 :(得分:4)

不,没有办法让目标字符串中包含非连续文本的单个匹配组。您需要使用替换,或将匹配的组粘合到一个新的字符串中。

答案 2 :(得分:2)

AFAIK,无法使用单个正则表达式。您必须按以下方式拨打replace();

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

可以(通常......)根据需要插入表达式

答案 3 :(得分:0)

我知道这个问题是几年前提出的,但是为了让仍在这里寻找答案的任何人,有一种方法可以像其他答案一样,将其他部分排除在外在中间只有一个表达式。

诀窍是使用“非捕获组”。使用此功能,可以使用包含未包含在结果中的组的表达式进行搜索。

其语法如下:

(?:Groups Contents)

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

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

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

它将匹配每个人的中间名“ Micheal”或“ James”,但只返回其姓氏和名字。

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

  • 詹姆森公爵

  • 鲍勃·詹姆斯

  • 鲍勃 米歇尔琼斯

  • 詹姆斯·安德森

  • 约瑟夫 米歇尔 Hetton

  • 条例草案 詹姆斯约翰逊

  • 乔治·罗纳德·麦卡锡