Java正则表达式的问题

时间:2014-03-16 19:38:38

标签: java regex split

我似乎无法使用正则表达式获取我想要的文本。

我需要用“......从...到...”分隔文本

示例输入:

text1 from text2 to text3

我目前的代码:

String[] word=input.split("from|to",3);

System.out.println("Text 1: "+word[0]);
System.out.println("Text 2: "+word[1]);
System.out.println("Text 3: "+word[2]);

如果我想在Text1中忽略单词'..from..to ..'并且仅使用'... from..to ..',我会如何改进此代码的任何想法,这是最后一次出现(即text2和text3)

示例:

from here to China will take you from 10 to 12 hours.

我想要文字:

  • text1:from here to China will take you作为一个单句
  • text2:10
  • text3:12 hours

2 个答案:

答案 0 :(得分:1)

String split()不会帮助您实现此目的。你必须使用模式匹配。见这个例子:

String text = "from here to China will take you from 10 to 12 hours";
Pattern pattern = Pattern.compile("\\b(from\\s+.*?)\\s+from\\s+(\\d+)\\s+to\\s+(\\d+\\s+hours?)\\b");

Matcher m = pattern.matcher(text);
if (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
}

如果你的字符串格式发生了其他变化,这将无效。

答案 1 :(得分:1)

这会像你的例子一样分割你的短语:

String input = "from here to China will take you from 10 to 12 hours";
System.out.println(Arrays.toString(input.split("\\bfrom\\b\\s+(?=\\d)|\\bto\\b\\s+(?=\\d)")));

在分割方法中使用from|to的问题是,您的短语包含fromto的多个出现。因此,在这种情况下,有必要指定您只需要fromto后跟空格和数字。还添加了字边界\\b以仅匹配to字词,而不是仅包含to的字词,例如toronto


所以你可以像这样调整你的代码:

String[] word=input.split("\\bfrom\\b\\s+(?=\\d)|\\bto\\b\\s+(?=\\d)");

System.out.println("Text 1: "+word[0]);

System.out.println("Text 2: "+word[1]);

System.out.println("Text 3: "+word[2]);

更新:正则表达式实际上可以简化为:

\\b(from|to)\\b\\s+(?=\\d)