2012-03-09 63 views
5

我试图在问题历史中找到问题的答案,但他们仅回来了一千多个,并且在扫描了几十个匹配的答案之后,向上。 所以这是我的问题。Java REGEX与字符串中的精确位数匹配

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

我是新来的正则表达式和关于它是如何工作的简短说明将有很大帮助。

预先感谢您

+2

六位数字总是相同吗?它会总是被空格分隔吗?如果是这种情况,你可能根本不需要使用Regex。我只是好奇,因为你没有指定六位数字的性质。 – 2012-03-09 02:08:51

+0

我有兴趣找到一个正好6位数的序列,不管它们是哪一个。 该序列可能被任何字符包围,包括或不包含空格。当我说任何我的意思是可以有任何UTF-8字符。其实我的搜索字符串是繁体中文,我不知道这可能是什么。重要的是,如果六位数字是多于六位数字的序列的一部分,不会产生任何匹配。 – Julian 2012-03-09 02:16:20

+0

这不是我想要的。 987654是超过6位数字序列(987654321)的一部分,我想排除这一点。 希望它澄清 谢谢 – Julian 2012-03-09 02:19:49

回答

11

您可以使用该模式(?<!\d)\d{6}(?!\d),意思是“不是由一个数字开头的字符串位置;其次是究竟六位数字;其次是一个字符串位置后面没有一位数字“。 (记号(?<!...),已知为负向后断言,指“不被...前面”。记号(?!...),已知为负前向断言,意思是“后面没有...”。记号\d装置的一个数字。记号{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;但是你的一个评论意味着这些数字可能会紧接着传统中文字符的前面或后面,这些中文字符被认为是单词字符(因此不会触发单词边界),所以我改变了这一点。

+0

'\ w','\ b',...是基于java的ASCII(所以你的'\ b'应该有意外工作),你可以通过使用Java 7标志'UNICODE_CHARACTER_CLASS',请参阅[here](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS) – stema 2012-03-09 08:31:00

+0

@stema:在Java中,尽管' \ w'默认是基于ASCII的,'\ b'是基于Unicode的。 (不知道为什么。) – ruakh 2015-06-02 18:00:51

1

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

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

编辑: 此方法使用负回顾后和负前瞻。它比字边界的做法略有不同,它会匹配以下字符串

123456asdf some text hello 

another string a123456 aaaaaaaa 

如果数字将始终用空格包围123456那么这个词边界的做法可能会更好。

+0

在我的示例中,我明确了我想要匹配的内容。也许这个问题不是很清楚。但你的正则表达式工作。非常感谢你。 – Julian 2012-03-09 02:35:43

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支持全球化并且不受空白限制。 – 2012-03-09 02:24:40

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 
0

在Javascript控制台进行此操作。小心\\d

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

r___ax145N