2017-02-11 35 views

回答

1

如果它是为寻找2个字那么简单,你可以使用indexOf找到他们,然后使用substring修剪字符串以放弃两个单词之后的所有内容。

String keyWord = "key word"; 
String input = "some\ntext\nkey word is here\nand more text\nto follow"; 
int pos = input.indexOf(keyWord); 
if (pos != -1) { 
    String trimmed = input.substring(0, pos + keyWord.length()); 
    System.err.println("'" + trimmed + "'"); 
} 

上面的代码假设你想保留关键词;如果您不想保留它,只需将+ keyword.length()放入substring即可。

如果您确实想要使用正则表达式,请传递Pattern.DOTALL标志以使点匹配行结束。你还需要改变正则表达式捕捉到你想保留什么,而不是你想要的东西丢弃(如你的例子有它):

String keyWordRegex = "key\\s+word"; 
Pattern pattern = Pattern.compile("(.*\\b" + keyWordRegex + "\\b).*", Pattern.DOTALL); 
Matcher matcher = pattern.matcher(input); 
String replaced = matcher.replaceAll("$1"); 
System.err.println("'" + replaced + "'"); 

正则表达式是这样的:

  • 第一,左括号开始捕捉
  • 捕获任何东西(点)的零到无限次(星)
  • 然后一个单词边界,以便它仅匹配“关键字”,而不是“masterkey词”
  • 那么你的钥匙单词rege X,在这个例子中我做了它是“关键”,一个或多个(加)空格(\ S),和“字”
  • 字边界再次
  • 关闭捕捉组
  • 允许任意数量(星号)(点)
+0

正则表达式匹配可以使用与索引版本相同的方式。您可以获得匹配的索引及其长度,然后像之前那样进行截断。这可能比让正则表达式比它更复杂更好。 –

0

没有必要使用正则表达式。你可以使用简单的字符串操作概念。

String str = "testing test foo bar test foo bar test \n testing all \n foo bar(.*) tester"; 

     String boundaryValueText = "foo bar"; 
     int boundaryValueIndex = str.indexOf(boundaryValueText); 
     String parsedContent = boundaryValueIndex != -1 ? new StringBuilder(str) 
       .delete(boundaryValueIndex + boundaryValueText.length(), str.length()).toString() : str; 
+0

由于..Will例如在添加多行支持。 –

+0

你能提供它不能工作的输入吗? –

+0

我试着用String str =“foo bar(。*)test foo bar(。*)test \ n测试所有foo bar(。*)tester”;和它的工作。 –

1

使用Single Line Mode匹配使用标记?s

str = str.replaceAll("(?s)foo bar(.*)", "");

如果使用正则表达式是不是强制性的,你可以简单地使用以下命令:

str = str.indexOf("foo bar") == -1 ? str : str.substring(0, str.indexOf("foo bar"));

1

你可以试试下面的解决方案。 找到foo bar后删除全部字符。

String a = "hell fdshf fdfjk foo bar ffsd fsajkh vsfdsv" ; 
String as = a.split("foo bar")[0]; 
System.out.println(as); 

输出

hell fdshf fdfjk

+0

你好chirag,你的答案是最好的,非常充分。 –

相关问题