考虑以下字符串:
"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一样有效)
你可以用
^(?!.*(?<!\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}
)。
你可以断言不公里向左和向右,并捕获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,也找不到在其中生成随机项的方法!例如:在普