Java REGEX匹配字符串中的确切位数

时间:2012-03-09 02:06:07

标签: java regex

我试着在问题历史中找到我的问题的答案,但他们只是回来了一千多个,在扫描了几十个匹配的答案之后我放弃了。 所以这是我的问题。

我希望能够在字符串中找到正好六位数的第一个序列。 鉴于字符串 “一些文字987654321和一些文字123456和其他一些文字再次654321和更多文字到底” 我想找到与123456序列匹配的正则表达式。

我是正则表达式的新手,关于它如何工作的简短解释会有很大帮助。

提前谢谢

5 个答案:

答案 0 :(得分:13)

您可以使用模式(?<!\d)\d{6}(?!\d),这意味着“字符串位置前面没有数字;后跟正好六位数字;后跟一个字符串位置,后面没有数字”。 (符号(?<!...),称为负面后瞻断言,表示“前面没有...”。符号(?!...),称为否定lookahead断言,表示“未跟...”。符号\d表示数字。符号{n}表示“ n 次”,所以例如\d{6}表示“六位数”。)

这可能是这样的:

final String number;
{
    final Matcher m = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)").matcher(input);
    if(m.find())
        number = m.group(); // retrieve the matched substring
    else
        number = null; // no match found
}

注意:此答案的先前版本建议使用字边界\b;但是你的一条评论表明,繁体中文字符可能会紧跟在前面或后面,这些字符被认为是单词字符(因此不会触发单词边界),所以我改变了它。

答案 1 :(得分:6)

您正在寻找的模式是:

(?x)              # enable comments
(?<! \p{Nd} )     # no decimal number before
\p{Nd} {6}        # exactly six repetitions of a decimal number
(?!= \p{Nd} )     # no decimal number after

那也会选择像

这样的东西
U+FF10 ‭ 0 FULLWIDTH DIGIT ZERO
U+FF11 ‭ 1 FULLWIDTH DIGIT ONE
U+FF12 ‭ 2 FULLWIDTH DIGIT TWO
U+FF13 ‭ 3 FULLWIDTH DIGIT THREE
U+FF14 ‭ 4 FULLWIDTH DIGIT FOUR
U+FF15 ‭ 5 FULLWIDTH DIGIT FIVE
U+FF16 ‭ 6 FULLWIDTH DIGIT SIX
U+FF17 ‭ 7 FULLWIDTH DIGIT SEVEN
U+FF18 ‭ 8 FULLWIDTH DIGIT EIGHT
U+FF19 ‭ 9 FULLWIDTH DIGIT NINE

如果您有中文文本。

答案 2 :(得分:1)

您发布的字符串中第一次出现6位数字实际上是987654。如果您的意思是第一次出现的6位数字由不是数字的字符包围,那么这应该有效:

(?<!\d)(\d{6})(?!\d)

编辑: 这种方法使用负后观和负前瞻。它与单词边界方法略有不同,因为它将匹配以下字符串中的123456

123456asdf some text hello

another string a123456 aaaaaaaa

如果数字总是被空格包围,那么单词边界方法可能更好。

答案 3 :(得分:1)

 public static String splitting(String str, int num){
    String arr[] = str.split("[^0-9]");
    for(String s:arr)
        if(s.length() == num)
            return s;
    return null;
}

进行测试
 public static void main(String[] args) {
    String s =  "Some text 987654321 and some more text 123456 and some other text again 654321 and more text in the end";
    System.out.println(splitting(s, 6));
}

输出

  123456

答案 4 :(得分:0)

Javascript控制台中的

可以解决这个问题。注意\\d

replacedString = "rx14ax145N".replace(RegExp("x14(?!\\d)", "g"), "___");

r___ax145N