字符串中的 1 或 2 位数字

3
抱歉,我不知道您是否理解我的意图,我也不确定是否可以通过正则表达式来完成,但也许有比我想象中更好的解决方案。
我想创建一个函数,该函数将一个字符串作为参数并检查该字符串中是否有整数(这是容易的部分)。如果存在整数,但位数超过2个或数字被分隔,则函数应返回false。
有效:
foo1bar foobar1 f12obar 12foobar 无效:
f1o2obar f1o23obar 因此,1或2位数字的正则表达式很简单。
[0-9]{1,2}

另一种我认为代码相当糟糕的方法是循环遍历整个字符串并计算每个整数。一旦我看到一个整数,而下一个不是整数,那么该字符串中的其他任何整数都将导致结束。
我希望有一种更顺畅的方法来解决这个问题。
3个回答

3

将所有非数字字符替换为空,然后使用该数字检查原始字符串是否包含它。

String str = "foo1b2ar"; //starting string
String num = str.replaceAll("[\\D]",""); //the number it contains
return str.contains(num) && num.length() <= 2; //does the original have that number all together? and is it short?

例子:

"foo1bar" -> "1" -> 原始字符串中包含 "1" 吗?是。

"f1o23obar" -> "123" -> 原始字符串中包含 "123" 吗?否。


2
您可以使用以下习语将整个字符串与只有1或2位数字的1个数字进行匹配:
String[] test = {
    "foo1bar",
    "foobar1",
    "f12obar",
    "12foobar",
    "f1o2obar",
    "f1o23obar"
};
for (String s: test) {
    //                   | matching the whole string
    //                   |       | non-digit, 0 or more times, reluctantly quantified
    //                   |       |     | 1 or 2 digits
    //                   |       |     |       | non digit, 0 or more times, 
    //                   |       |     |       | reluctantly quantified
    System.out.println(s.matches("\\D*?\\d{1,2}\\D*?"));
}

输出

true
true
true
true
false
false

0

正则表达式

[^0-9]*[0-9]{1,2}[^0-9]*

你会注意到在链接的演示中,我放置了^$锚点,并使用了m多行修饰符...这取决于您的实现,可能需要或不需要。

基本上,我正在寻找由0个或多个非数字字符包围的1-2个数字。


1
也许我只是偏爱一行代码,但我更喜欢这个解决方案,胜过当前的答案。(此外,根据Java中String.replaceAll()和String.contains()(正则表达式与迭代搜索)的实现方式,纯正则表达式(有限自动机)可能会更快。) - River
谢谢@River,不知道为什么有人会踩它。我猜可能是因为我没有“必须”使用正则表达式……但它确实解决了OP的问题。 - Sam
@MaxZoom 你有没有看过我的答案或者尝试过我的演示?我在多行演示中包含了锚点,但是根据 OP 集成这个表达式的方式,它可能是必要的,也可能不是必要的。 - Sam
不,我以前太懒了。但是现在我已经阅读过了,它可能有效。你会如何在Java代码中使用它? - MaxZoom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接