Java 如何为字符串编写正则表达式模式来标识空格或hypen之前的数字?

Java 如何为字符串编写正则表达式模式来标识空格或hypen之前的数字?,java,regex,Java,Regex,我有一个自由流动的字符串,其中包含一些随机文本,如下所示: “一些随机文本080 2668215901” “一些ramdom文本040-1234567890” “一些随机文本0216789101112” 我需要捕获3位数字和以下10位数字: 有空间条件 催眠状态 没有任何空间/宣传 我正在使用Java 这就是我试图从自由流动的文本中获得的数字: "\\w+([0-9]+)\\w+([0-9]+)" 我可以做一个字符串长度检查,看看在Hypen或空格之前是否有任何3位数字,之后是10位数

我有一个自由流动的字符串,其中包含一些随机文本,如下所示:

  • “一些随机文本080 2668215901”
  • “一些ramdom文本040-1234567890”
  • “一些随机文本0216789101112”
我需要捕获3位数字和以下10位数字:

  • 有空间条件
  • 催眠状态
  • 没有任何空间/宣传
我正在使用Java

这就是我试图从自由流动的文本中获得的数字:

"\\w+([0-9]+)\\w+([0-9]+)"
我可以做一个字符串长度检查,看看在Hypen或空格之前是否有任何3位数字,之后是10位数字。但我真的很想探索正则表达式是否能给我一个更好的解决方案


另外,如果字符串中有更多的事件,我需要捕获它们。我还需要捕获任何10位数的字符串,它们不需要在hypen和空格之前,这里是一个较长的演示。从上面的回答中,您还可以在比赛后查找带有尾随字符的比赛

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Class {
  private static final Pattern p = Pattern.compile("" +
    "((?<threeDigits>\\d{3})[- ]?)?" +
    "(?<tenDigits>\\d{10})");

  public static void main(String... args) {
    final String input =
      "Here is some text to match: Some random text 080 2668215901. " +
        "We're now matching stray sets of ten digit as well: 1234567890. " +
        "Notice how you get the first ten and the second ten, with the preceding three:1234123412-040-1234567890" +
        "A stranger case:111222333444555666777888. Where should matches here begin and end?";
    printAllMatches(p.matcher(input));
  }

  private static void printAllMatches(final Matcher m) {
    while (m.find()) {
      System.out.println("three digits: " + m.group("threeDigits"));
      System.out.println("ten digits: " + m.group("tenDigits"));
    }
  }

}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
班级{
私有静态最终模式p=Pattern.compile(“”)+
“((?\\d{3})[-]?)”+
“(?\\d{10})”;
公共静态void main(字符串…参数){
最终字符串输入=
“这里有一些要匹配的文本:一些随机文本080 2668215901。”+
“我们现在也在匹配十位数的零散集:1234567890。”+
注意如何得到前十个和后十个,以及前三个:1234123412-040-1234567890+
“陌生人案例:11122233344455666777888。这里的比赛应该从哪里开始和结束?”;
printalmatches(p.matcher(输入));
}
私有静态void printalmatches(最终匹配器m){
while(m.find()){
System.out.println(“三位数:+m.group(“三位数”);
System.out.println(“十位数:+m.group(“趋势”));
}
}
}

切换到findall作战计划。

这里是一个较长的演示。从上面的回答中,您还可以在比赛后查找带有尾随字符的比赛

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Class {
  private static final Pattern p = Pattern.compile("" +
    "((?<threeDigits>\\d{3})[- ]?)?" +
    "(?<tenDigits>\\d{10})");

  public static void main(String... args) {
    final String input =
      "Here is some text to match: Some random text 080 2668215901. " +
        "We're now matching stray sets of ten digit as well: 1234567890. " +
        "Notice how you get the first ten and the second ten, with the preceding three:1234123412-040-1234567890" +
        "A stranger case:111222333444555666777888. Where should matches here begin and end?";
    printAllMatches(p.matcher(input));
  }

  private static void printAllMatches(final Matcher m) {
    while (m.find()) {
      System.out.println("three digits: " + m.group("threeDigits"));
      System.out.println("ten digits: " + m.group("tenDigits"));
    }
  }

}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
班级{
私有静态最终模式p=Pattern.compile(“”)+
“((?\\d{3})[-]?)”+
“(?\\d{10})”;
公共静态void main(字符串…参数){
最终字符串输入=
“这里有一些要匹配的文本:一些随机文本080 2668215901。”+
“我们现在也在匹配十位数的零散集:1234567890。”+
注意如何得到前十个和后十个,以及前三个:1234123412-040-1234567890+
“陌生人案例:11122233344455666777888。这里的比赛应该从哪里开始和结束?”;
printalmatches(p.matcher(输入));
}
私有静态void printalmatches(最终匹配器m){
while(m.find()){
System.out.println(“三位数:+m.group(“三位数”);
System.out.println(“十位数:+m.group(“趋势”));
}
}
}
切换到findall作战计划。

通常是
(\d{3})[-]?(\d{10})

边界条件可能是
(?

,通常是
(\d{3})[-](\d{10})


对于边界条件可能
(?

假设您将在单独的行上运行此正则表达式,并忽略一些…更具表现力的正则表达式实现,这可能是最简单的方法:

/([0-9]{3})[ -]?([0-9]{10})/
如果文本可能以数字结尾,则需要将结果锚定到行尾,如下所示:

/([0-9]{3})[ -]?([0-9]{10})$/
如果保证输入周围有文字双引号字符,则可以使用:

/([0-9]{3})[ -]?([0-9]{10})"$/
如果您需要匹配整行进行一些输入错误测试,您可以使用:

/^"(.+)([0-9]{3})[ -]?([0-9]{10})"$/

假设您将在单独的行上运行此正则表达式,并忽略一些……更具表现力的正则表达式实现,这可能是最简单的方法:

/([0-9]{3})[ -]?([0-9]{10})/
如果文本可能以数字结尾,则需要将结果锚定到行尾,如下所示:

/([0-9]{3})[ -]?([0-9]{10})$/
如果保证输入周围有文字双引号字符,则可以使用:

/([0-9]{3})[ -]?([0-9]{10})"$/
如果您需要匹配整行进行一些输入错误测试,您可以使用:

/^"(.+)([0-9]{3})[ -]?([0-9]{10})"$/

“带空格条件”是什么意思?要捕获前3位数字和后面10位数字,还是要验证模式?带空格(“”)的条件。在本例中,这是第一种情况。“带空格条件”是什么意思是指?您想要捕获前3位数字和后面10位数字,还是想要验证模式?具有空格(“”)的条件…在本例中,这是第一个场景。谢谢Andreas,我可以在我的示例中尝试。但是\\D?是否只包括空格和hypen?谢谢Andreas,这真的很有帮助。我们如何忽略选项卡?另外,在第一个场景中,如果我想包括10位数字,我的正则表达式如何更改?谢谢Andreas,这真的很有帮助。但是,我们如何忽略标签呢?另外,在第一个场景中,如果我想将10位数字与另一个一起包含,我的正则表达式如何变化?另外,关于您提到的边缘情况,是的,我需要返回两个数字。对于123-8908908908-456-1231231。总结一下,“一些随机文本1234123412 080 2668215901 abracadabra 1234567890”,必须返回1234123412和1234567890。“如果您有两个有效答案:123-8908908908-456-1231231231?应该返回什么”};必须返回8908908908和1231231。”如果你有两个有效答案:123-8908908908-456,这里有一些字符串,还有一个数字080-1231231231,那该怎么办?8908908908和1231231231必须是returedAwesome!这很有效!关于陌生人的情况,有可能完全忽略这个数字,因为它不是一个3位数后跟一个hiphen/space/10位数的数字,也不是一个独立的10位数吗它的号码?谢谢安德烈亚斯,我可以在我的样品上试一试。但是我可以