繁体   English   中英

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

[英]Java REGEX to match an exact number of digits in a string

我试图在问题历史记录中找到问题的答案,但是当他们浏览了我放弃的数十个匹配答案后,它们又回到了一千多个。 所以这是我的问题。

我希望能够找到一个字符串中正好六个数字的第一个序列。 给定字符串“某些文本987654321和一些其他文本123456,以及其他一些文本再次654321和最后还有更多文本”,我想找到与123456序列匹配的正则表达式。

我是regex的新手,对它如何工作的简短解释会很有帮助。

先感谢您

您可以使用模式(?<!\\d)\\d{6}(?!\\d) ,它表示“字符串位置,其后没有数字;紧随其后的是六位数字;然后是字符串-没有数字的位置”。 (符号(?<!...) ,被称为否定的后向断言 ,表示“不以...开头”。符号(?!...) ,被称为否定的前瞻性断言 ,表示“未跟随”。由... ”。记号\\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 但是您的评论之一表明,数字可能会紧跟在繁体中文字符之前或之后,繁体中文字符被视为文字字符(因此不会触发文字边界),因此我将其更改。

您正在寻找的模式是:

(?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

如果您有中文文本。

您发布的字符串中首次出现的6位数字实际上是987654 如果您是第一次出现6位数字,然后用非数字字符包围,那么应该可以:

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

编辑:此方法使用一个否定的后向和否定的前瞻。 它与单词边界方法稍有不同,因为它将与以下字符串中的123456匹配

123456asdf some text hello

another string a123456 aaaaaaaa

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

 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

在Javascript控制台中可以做到这一点。 注意\\\\d

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

r___ax145N

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM