正则表达式忽略捕获的中间部分
本文关键字:中间部 正则表达式 | 更新日期: 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