正则表达式Java字符串的数字部分

时间:2013-01-10 00:13:59

标签: java regex

我试图编写一个Java方法,它将字符串作为参数,如果匹配模式则返回另一个字符串,否则返回null。模式:

  • 以数字(1位数字)开头;
  • 然后是
  • 冒号(" :");
  • 然后是
  • 单个空格("");
  • 然后是
  • 任何 1个以上字符的Java字符串

因此,一些符合此模式的有效字符串:

50: hello
1: d
10938484: 394958558

的一些字符串符合此模式:

korfed49
: e4949
6
6:
6:sdjjd4

该方法的一般骨架是:

public String extractNumber(String toMatch) {
    // If toMatch matches the pattern, extract the first number
    // (everything prior to the colon).

    // Else, return null.
}

到目前为止,这是我最好的尝试,但我知道我错了:

public String extractNumber(String toMatch) {
    // If toMatch matches the pattern, extract the first number
    // (everything prior to the colon).
    String regex = "???";
    if(toMatch.matches(regex))
        return toMatch.substring(0, toMatch.indexOf(":"));

    // Else, return null.
    return null;
}

提前致谢。

2 个答案:

答案 0 :(得分:4)

您的描述是现货,现在只需要翻译成正则表达式:

^      # Starts
\d+    # with a number (1+ digits); then followed by
:      # A colon (":"); then followed by
       # A single whitespace (" "); then followed by
\w+    # Any word character, one one more times
$      # (followed by the end of input)

在Java字符串中给予:

"^\\d+: \\w+$"

您还想捕获数字:在\d+周围加上括号,使用Matcher,如果匹配则捕获第1组:

private static final Pattern PATTERN = Pattern.compile("^(\\d+): \\w+$");

// ...

public String extractNumber(String toMatch) {
    Matcher m = PATTERN.matcher(toMatch);
    return m.find() ? m.group(1) : null;
}

注意:在Java中,\w仅匹配ASCII字符和数字(例如,.NET语言不是这种情况),它也会匹配下划线。如果您不想使用下划线,可以使用(Java特定语法):

[\w&&[^_]]
对于正则表达式的最后一部分,

而不是\w,给出:

"^(\\d+): [\\w&&[^_]]+$"

答案 1 :(得分:2)

尝试使用以下内容:\ d +:\ w +