Java:需要从字符串中提取数字
我有一个包含数字的字符串。类似于Java:需要从字符串中提取数字,java,regex,Java,Regex,我有一个包含数字的字符串。类似于“事件#492-标题描述” 我需要从这个字符串中提取数字。 尝试 通过得到一个错误 java.lang.IllegalStateException: No match found 我做错了什么? 正确的表达方式是什么? 很抱歉问了这么简单的问题,但我搜索了很多,但仍然没有找到如何执行此操作(可能是因为这里太晚了…您需要调用一个匹配器方法,如查找,matches或lookingAt以实际运行匹配。您需要调用Matcher方法之一,如find、matches或l
“事件#492-标题描述”
我需要从这个字符串中提取数字。
尝试 通过得到一个错误
java.lang.IllegalStateException: No match found
我做错了什么?正确的表达方式是什么?
很抱歉问了这么简单的问题,但我搜索了很多,但仍然没有找到如何执行此操作(可能是因为这里太晚了…您需要调用一个
匹配器
方法,如查找
,matches
或lookingAt
以实际运行匹配。您需要调用Matcher
方法之一,如find
、matches
或lookingAt
以实际运行匹配。由于需要调用find()在访问组之前,在匹配器上执行:
Matcher m = p.matcher(theString);
while (m.find()) {
String substring =m.group();
System.out.println(substring);
}
您遇到此异常是因为在访问组之前,需要在匹配器上调用find()
:
Matcher m = p.matcher(theString);
while (m.find()) {
String substring =m.group();
System.out.println(substring);
}
这里有两件事不对:
- 您使用的模式并不是最适合您的场景,它只是检查字符串是否只包含数字。另外,由于它不包含组表达式,因此调用
group()
- 在你打电话给一个小组之前,你需要确定匹配者有匹配者
让我们从正则表达式开始。这是它现在的样子
只有与包含其中所有数字的字符串匹配。您特别关心的是该字符串中的数字,因此您需要一个表达式:
- 不在乎前面有什么
- 不在乎后面是什么
- 只匹配一次出现的数字,并在组中捕获它
为此,您可以使用以下表达式:
.*?(\\d+).*
最后一部分是确保matcher可以找到匹配项,并获得正确的组。这是通过以下方式实现的:
if (m.matches()) {
String substring = m.group(1);
System.out.println(substring);
}
现在大家一起:
Pattern p = Pattern.compile(".*?(\\d+).*");
final String theString = "Incident #492 - The Title Description";
Matcher m = p.matcher(theString);
if (m.matches()) {
String substring = m.group(1);
System.out.println(substring);
}
这里有两件事不对:
- 您使用的模式并不是最适合您的场景,它只是检查字符串是否只包含数字。另外,由于它不包含组表达式,因此调用
group()
- 在你打电话给一个小组之前,你需要确定匹配者有匹配者
让我们从正则表达式开始。这是它现在的样子
只有与包含其中所有数字的字符串匹配。您特别关心的是该字符串中的数字,因此您需要一个表达式:
- 不在乎前面有什么
- 不在乎后面是什么
- 只匹配一次出现的数字,并在组中捕获它
为此,您可以使用以下表达式:
.*?(\\d+).*
最后一部分是确保matcher可以找到匹配项,并获得正确的组。这是通过以下方式实现的:
if (m.matches()) {
String substring = m.group(1);
System.out.println(substring);
}
现在大家一起:
Pattern p = Pattern.compile(".*?(\\d+).*");
final String theString = "Incident #492 - The Title Description";
Matcher m = p.matcher(theString);
if (m.matches()) {
String substring = m.group(1);
System.out.println(substring);
}
你能断言字符串中不会有其他数字吗?是的,在我的情况下,只有一个数字。你能断言字符串中不会有其他数字吗?是的,在我的情况下,只有一个数字。或者匹配()
,如果字符串不允许使用无关字符。@Andreas没错。OP的字符串允许使用其他字符。如果字符串不允许使用无关字符,则可以使用。
匹配()
。@Andreas没错。不过OP的字符串允许使用其他字符。OP使用的模式是100%正确的,只要您不尝试在其上使用matches()
。他不需要\\d+
部分前面或后面的内容,也不需要超出默认组0的组,除非他希望捕获字符串的其他部分。@dasblinkenlight:我会重新表述它-那么,它不是最理想的正则表达式。只要您使用find
,它就可以工作,但当我编写正则表达式时,我希望它能够明确匹配特定的内容。OP使用的模式是100%正确的,只要您不尝试在其上使用matches()
。他不需要\\d+
部分前面或后面的内容,也不需要超出默认组0的组,除非他希望捕获字符串的其他部分。@dasblinkenlight:我会重新表述它-那么,它不是最理想的正则表达式。只要您使用find
,它就可以工作,但是当我编写正则表达式时,我希望它能够明确地匹配特定的内容。