![](/img/trans.png)
[英]Regex searching for a letter starting a word and next word containing another word
[英]Regex: finding words that end with the same letter the next word begins with
我試圖讓正則表達式工作但不能(可能是因為我對正則表達式相當陌生)。
這就是我想要做的:
考慮一下這段文字:一個詞,決斗。 萊姆說再見。
通緝對象:一個字,決斗。 萊姆說再見。
正如前面在標題中提到的,我想要匹配連續的單詞,一個以(例如)“t”結尾,另一個以“t”開頭,不區分大小寫。
我最接近答案的是這個表達式[^az][az]*([az])[^az]+\1[az]*([az])[^az]+\2[az]*[^az]
您可以使用
(?i)\b(?<w>\p{L}+)(?:\P{L}+(?<w>(\p{L})(?<=\1\P{L}+\1)\p{L}*))+\b
請參閱正則表達式演示。 結果在“w”組捕獲集合中。
細節
\b
- 單詞邊界(?<w>\p{L}+)
- 組 "w" ( word ): 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)
- 緊靠當前position左邊,必須有第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));
如果一個單詞由至少 2 個字符 az 組成,您可以使用 2 個捕獲組在正向前瞻中交替檢查下一個單詞是否以最后一個字符開頭,或者前一個單詞是否以最后一個字符結尾並且當前單詞是否以最后一個字符開頭.
啟用不區分大小寫的匹配:
\b([a-z])[a-z]*([a-z])\b(?:(?=[,.]? \2)|(?<=\1 \1[a-z]+))
\b
字邊界([az])
捕獲組 1匹配 az[az]*
匹配 0+ 次之間的 az([az])
捕獲組 2匹配 az\b
字邊界(?:
非捕獲組
(?=
正向前瞻,斷言右邊是
[,.]? \2
[,.]? \2
一個可選的.
或,
空間和第 2 組中捕獲的內容)
關閉前瞻|
或者(?<=
Positive lookbehind, assert what is on the left is
\1 \1[az]+
匹配第 1 組和空格中捕獲的內容和 1+ 次字符 az)
近距離觀察)
關閉非捕獲組請注意,匹配[a-zA-Z]
是一個單詞的小范圍。 您可以改用\w
或\p{L}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.