Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:需要从字符串中提取数字_Java_Regex - Fatal编程技术网

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
,它就可以工作,但是当我编写正则表达式时,我希望它能够明确地匹配特定的内容。