我需要匹配正则表达式以匹配同一字符串中的多个匹配项。 模式是字母然后零或更多数字,字母,冒号然后正斜杠然后一个或多个数字,字母然后反斜杠然后再一个或多个数字,字母
例如,
w:/a\bc::/12\xyz
应该给我出现8。
我尝试了以下代码
Regex a11 = new Regex(@"([a-z]+[a-z1-9:]+/[a-z1-9]+\\[a-z1-9]+)+");
Regex a1 = new Regex(@"([a-z]+/[a-z1-9]+\\[a-z1-9]+)+");
var a = a11.Matches(@"w:/a\bc::/12\\xyz");
但即使多次出现也只匹配一次。同样在模式中,第二个字符是可选的,所以我声明了两个正则表达式。有没有办法在一个正则表达式中做所有事情。非常感谢任何帮助
“a”只有一场比赛。
答案 0 :(得分:0)
您需要从输入字符串生成所有从一个相同位置开始的子串,然后使用^
和$
个锚点附带的模式来测试整个字符串匹配。
这是一种方法:
var s = "w:/a\\bc::/12\\xyz";
var r = new Regex(@"^\p{L}+[\p{L}\d:]*/[\p{L}\d]+\\[\p{L}\d]+$", RegexOptions.Compiled);
for (var q = 0; q < s.Length; ++q)
for (var w = q; w <= s.Length; ++w)
{
var cur = s.Substring(q, w-q);
if (r.IsMatch(cur))
Console.WriteLine("FOUND: {0}", cur);
}
输出:
FOUND: w:/a\b
FOUND: w:/a\bc
FOUND: bc::/12\x
FOUND: bc::/12\xy
FOUND: bc::/12\xyz
FOUND: c::/12\x
FOUND: c::/12\xy
FOUND: c::/12\xyz
请参阅C# demo。
模式是
^\p{L}+[\p{L}\d:]*/[\p{L}\d]+\\[\p{L}\d]+$
<强>详情
^
- 字符串开头\p{L}+
- 1+个字母[\p{L}\d:]*
- 0+个字母,数字或/和:
/
- /
字符[\p{L}\d]+
- 1+个字母或/和数字\\
- \
字符[\p{L}\d]+
- 1+个字母或/和数字$
- 字符串结束。请参阅regex demo at regex101.com。
注意:要仅匹配ASCII字母,请将\p{L}
替换为模式[a-zA-Z]
中的@"^[a-zA-Z]+[a-zA-Z\d:]*/[a-zA-Z\d]+\\[a-zA-Z\d]+$"
。
答案 1 :(得分:0)
public static void Main(string[] args)
{
List<string> commands = new List<string>()
{
@"w\\//a/b",
@"w\\//a\b",
@"w\\/a\b",
@"w:://a\b",
@"w::/a\b",
@"w:/a\bc::/12\xyz"
};
var titlist = commandCount(commands);
foreach (var value in titlist)
{
Console.WriteLine(value);
}
Console.Read();
}
public static List<int> commandCount(List<string> commands)
{
List<int> lengths = new List<int>();
foreach (var command in commands)
{
var count = 0;
var substring = GetAllSubstring(command);
for (int i = 0; i < substring.Count; i++)
{
string input = substring[i];
Regex r1 = new Regex(@"^[a-z]{1}\w*\:*\/\w+\\[a-z]+$");
Match match = r1.Match(input);
if (match.Success)
count += match.Groups.Count;
}
lengths.Add(count);
}
return lengths;
}
static List<string> GetAllSubstring(string command)
{
List<string> substrings = new List<string>();
char[] array = command.ToCharArray();
for (int i = 0; i < array.Length; i++)
{
StringBuilder sub = new StringBuilder(array[i].ToString());
substrings.Add(sub.ToString());
for (int j = i+1; j < array.Length; j++)
{
substrings.Add(sub.Append(array[j]).ToString());
}
}
return substrings;
}
}