我试图使regex正常工作,但无法(可能是因为我对regex相当陌生)。
这是我想做的:
考虑以下文本:一个单词,决斗。酸橙说再见。
想要的比赛:一个字,决斗。酸橙 说再见。
正如标题中先前提到的,我想使连续的单词匹配,一个单词以(例如)“ t”结尾,另一个单词以“ t”开头,不区分大小写。
我最接近答案的就是这个表达式 [^a-z][a-z]*([a-z])[^a-z]+\1[a-z]*([a-z])[^a-z]+\2[a-z]*[^a-z]
您可以使用
(?i)\b(?<w>\p{L}+)(?:\P{L}+(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*))+\b
请参阅regex演示。结果在“ w”组捕获集合中。
细节
\b
-单词边界(?<w>\p{L}+)
-组“ w”(单词):1个或多个BMP Unicode字母(?:\P{L}+(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*))+
-1次或多次重复
\P{L}+
-除BMP Unicode字母外的1个或多个字符(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*)
-组“ w”:
(\p{L})
-入组1的一封信(?<=\1\P{L}+\1)
-在当前位置的左侧,必须有与第1组中捕获的字母相同的字母,除了字母以外还有1个以上的字符,第1组中的字母\p{L}*
-0个或更多字母\b
-单词边界。var text = "One word, duel. Limes said bye.";
var pattern = @"\b(?<w>\p{L}+)(?:\P{L}+(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*))+\b";
var result = Regex.Match(text, pattern, RegexOptions.IgnoreCase)?.Groups["w"].Captures
.Cast<Capture>()
.Select(x => x.Value);
Console.WriteLine(string.Join(", ", result)); // => word, duel, Limes, said
string text = "One word, duel. Limes said bye.";
string pattern = @"\b(?<w>\p{L}+)(?:\P{L}+(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*))+\b";
Match result = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
List<string> output = new List<string>();
if (result.Success)
{
foreach (Capture c in result.Groups["w"].Captures)
output.Add(c.Value);
}
Console.WriteLine(string.Join(", ", output));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句