我试着在问题历史中找到我的问题的答案,但他们只是回来了一千多个,在扫描了几十个匹配的答案之后我放弃了。 所以这是我的问题。
我希望能够在字符串中找到正好六位数的第一个序列。 鉴于字符串 “一些文字987654321和一些文字123456和其他一些文字再次654321和更多文字到底” 我想找到与123456序列匹配的正则表达式。
我是正则表达式的新手,关于它如何工作的简短解释会有很大帮助。
提前谢谢
答案 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)
可以解决这个问题。注意\\d
:
replacedString = "rx14ax145N".replace(RegExp("x14(?!\\d)", "g"), "___");
r___ax145N