考虑以下字符串:
"via caporale degli zuavi 278a , 78329"
和
"autostrada a1 km - 47"
我希望分离出一个特定的序列,该序列可以存在(第一个示例)也可以不存在(第二个示例)
特别是,我正在寻找一个数字序列,它可以是长1到4个数字,后面可以是一个字母,但在字符串中也不能有子字符串“km”。因此,在我前面的示例中,“278a”是有效的,但数字序列的其余部分不是。
到目前为止,我所做的是:
因为我知道任何包含“km”的字符串都是无效的,所以我应用了这段代码:
if(!stripped.ToLower().Contains("km"))
{
// apply Regex
}
else
// string not valid, move on
我知道这个正则表达式会给我所有的数字:Regex。匹配(t,@“\d”)代码>,但这还不够。我怎样才能从这里开始?
编辑:为了进一步说明,当一个数字序列后面跟一个字母时,该字母必须是下一个字符(因此没有空格或其他字符)
Edit2:请注意,数字序列后面可以跟字母,也可以不跟字母(所以278a和278一样有效)
你可以断言不公里向左和向右,并捕获1-4位0-9在一组和匹配和一个字符a-zA-Z:
(?<!\bkm\b.*)\b[0-9]{1,4}[A-Za-z]?\b(?!.*\bkm)
(?
.NET正则表达式演示
string pattern = @"(?<!\bkm\b.*)\b[0-9]{1,4}[A-Za-z]?\b(?!.*\bkm)";
string input = @"via caporale degli zuavi 278a , 78329
via caporale degli zuavi 277 , 78329
via caporale degli zuavi 279a , 78329 km
km via caporale degli zuavi 280a , 78329
autostrada a1 km - 47";
foreach (Match m in Regex.Matches(input, pattern))
{
Console.WriteLine(m.Value);
}
输出
278a
277
如果预期只有1个匹配,您也可以在整个字符串中排除km,并在Regex中使用捕获组。匹配
^(?!.*\bkm\b).*\b([0-9]{1,4}[A-Za-z]?)\b
正则表达式演示
你可以用
^(?!.*(?<!\p{L})km\b)(?:.*\D)?(\d{1,4})(?=\p{L}?\b)
看。NET正则表达式演示。细节:
^
-字符串的开头请参见C#演示:
var l = new List<string> {"via caporale degli zuavi 278a , 78329","autostrada a1 km - 47"};
foreach (var t in l)
{
var rx = @"^(?!.*(?<!\p{L})km\b)(?:.*\D)?(\d{1,4})(?=\p{L}?\b)";
var match = Regex.Match(t, rx, RegexOptions.ECMAScript)?.Groups[1].Value;
if (!string.IsNullOrEmpty(match))
{
Console.WriteLine($"There is a match in '{t}': {match}");
}
else
{
Console.WriteLine($"There is no match in '{t}'.");
}
}
输出:
There is a match in 'via caporale degli zuavi 278a , 78329': 278
There is no match in 'autostrada a1 km - 47'.
RegexOptions.ECMAScript
选项用于使\d
仅匹配ASCII数字(但它不影响\p{L}
)。