我无法理解如何解决以下问题:
我输入字符串" aaaabaa"我试图搜索字符串" aa" (我正在寻找角色的位置) 预期的结果是 0 1 2 5
我已经使用另一种方法(非RegEx)解决了这个问题。 但是我需要一个RegEx,我是RegEx的新手,所以google-search无法帮助我。 任何帮助赞赏!谢谢!
P.S。
我曾尝试使用(aa)*
和"\b(\w+(aa))*\w+"
,但这些表达方式错误
答案 0 :(得分:2)
您可以使用前瞻
解决此问题a(?=a)
会找到每个“a”后跟另一个“a”。
如果你想更普遍地这样做
(\p{L})(?=\1)
这将找到后面跟有相同字符的每个字符。每个找到的字母都存储在一个捕获组中(由于括号左右),capturing group((?=...)
)会使用\1
(在\1
中重复使用此positive lookahead assertion \p{L}
存储了匹配字符)
String text = "aaaabaa";
Regex reg = new Regex(@"(\p{L})(?=\1)");
MatchCollection result = reg.Matches(text);
foreach (Match item in result) {
Console.WriteLine(item.Index);
}
是一个带有“letter”类别的unicode代码点
<强>代码强>
{{1}}
输出
0
1
2
5
答案 1 :(得分:0)
以下代码可以与任何正则表达式一起使用,而无需更改实际表达式:
Regex rx = new Regex("(a)\1"); // or any other word you're looking for.
int position = 0;
string text = "aaaaabbbbccccaaa";
int textLength = text.Length;
Match m = rx.Match(text, position);
while (m != null && m.Success)
{
Console.WriteLine(m.Index);
if (m.Index <= textLength)
{
m = rx.Match(text, m.Index + 1);
}
else
{
m = null;
}
}
Console.ReadKey();
它使用该选项更改每个连续搜索的正则表达式搜索的起始索引。实际问题来自于,默认情况下,Regex引擎将始终在上一次匹配后继续搜索。所以它永远不会在另一场比赛中找到可能的比赛,除非你通过使用预测构造或通过手动设置起始索引来指示它。
另一个相对简单的解决方案是将整个表达式放在前瞻性的前瞻中:
string expression = "(a)\1"
Regex rx2 = new Regex("(?=" + expression + ")");
MatchCollection ms = rx2.Matches(text);
var indexes = ms.Cast<Match>().Select(match => match.Index);
这样,引擎会在找到的每个匹配项中自动将索引提前一个。
当通过调用NextMatch方法重复匹配尝试时,正则表达式引擎会给出空匹配特殊处理。通常,NextMatch开始搜索下一场比赛的确切位置。但是,在空匹配之后,NextMatch方法在尝试下一个匹配之前前进一个字符。此行为可确保正则表达式引擎将在字符串中前进。否则,因为空匹配不会导致任何向前移动,所以下一个匹配将在与前一个匹配完全相同的位置开始,并且它将重复匹配相同的空字符串。
答案 2 :(得分:-1)
试试这个:
How can I find repeated characters with a regex in Java?
它是在java中,但是正则表达式和非正则表达式是存在的。 C#Regex与Java方式非常相似。