当前位置: 首页 > 知识库问答 >
问题:

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

严稳
2023-03-14

考虑以下字符串:

"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个答案

狄赞
2023-03-14

你可以用

^(?!.*(?<!\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})。

严狐若
2023-03-14

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

正则表达式演示

 类似资料:
  • 因此,我试图提出一种算法,在字符串数组中查找带有特定字符/字母的单词。 有没有一个聪明的方法,也许通过排序列表,然后以某种方式搜索? 另外,这个算法的运行时间是多少?它会被认为是O(n)还是O(n*m)?其中n是字典中的单词数,m是数组中每个单词的长度。

  • 我有一个HashMap,里面有键和值。我想用字符串中映射的值替换键。 在字符串中,键被写成@keyname或@“keyname”,这些应替换为map.get(“keyname”) 假设我们的地图是这个 所以如果我们处理字符串“Hello world,Iam@key1 years old.”,它将变成“Hello world,Iam 2 years old.”。 我们可以用@“key1”代替@key

  • 问题内容: 下面是我的表 当我执行 我的位置是1。 我要实现的是找到整数的第一个位置,这样我将获得以下输出。 任何想法我怎么能做到这一点? 问题答案: 在xdazz答案的帮助下,我做了一些更改,最后得到了答案… 演示版

  • 我有一个字符串“1,3,5,7,9,11,12,14”,我想检查该字符串在java中是否包含“12,3,14”。 我的代码:

  • 我想检查一个字符串是否包含特殊字符,比如!@#$%^&*.,<>/\'“;:?如果字符串至少包含其中一个字符,则返回true。 我尝试使用以下regex脚本:

  • 问题内容: 我有一个像这样的数组: 我要做的是删除“苹果”。 我的问题很基本,但是,我搜索了网站,发现java并不真正支持从数组中删除功能。我还听说过使用Java Utils,因为删除项目非常简单…。我试图在Google上找到Java Utils,但是几乎所有链接都消失了。 所以最后…有什么方法可以从字符串数组中删除字符串? 即使我使用ArrayList,也找不到在其中生成随机项的方法!例如:在普