提问者:小点点

查找字符串中数字的特定模式


考虑以下字符串:

"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一样有效)


共2个答案

匿名用户

你可以断言不公里向左和向右,并捕获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})。