2

我有一段文本,我试图在其中找到一个字符序列。String.contains()行不通,所以我尝试使用String.matches方法和正则表达式。我当前的正则表达式不起作用。这是我的尝试:

"1stline\r\n2ndline".matches("(?im)^1stline$"); 
// returns false; I expect true

"1stline\r\n2ndline".matches("(?im)^1stline$") 
// returns false

"1stline\r\n2ndline\r\n3rdline".matches("(?im)^2ndline$")   

"1stline\n2ndline\n3rdline".matches("(?im)^2ndline$")

"1stline\n2ndline\n3rdline".matches("(?id)^2ndline$")

我应该如何格式化我的正则表达式以使其返回 true?

4

3 回答 3

13

您需要使用s标志(而不是m标志)。

它被称为DOTALL选项。

这对我有用:

  String input = "1stline\n2ndLINE\n3rdline";
  boolean b = input.matches("(?is).*2ndline.*");

我在这里找到了。

请注意,.*如果您想使用String.matches().

那是因为String.matches()尝试将整个字符串与模式匹配。

.* 在正则表达式中使用时表示零个或多个任何字符


另一种方法,在这里找到:

  String input = "1stline\n2ndLINE\n3rdline";
  Pattern p = Pattern.compile("(?i)2ndline", Pattern.DOTALL);
  Matcher m = p.matcher(input);
  boolean b = m.find();
  print("match found: " + b);

我通过谷歌搜索"java regex multiline"并单击第一个结果找到了它。

这几乎就像那个答案是为你写的......

这里有大量关于模式和正则表达式的信息


如果 您只想匹配2ndline出现在一行的开头,请执行以下操作:

   boolean b = input.matches("(?is).*\\n2ndline.*");

或这个:

 Pattern p = Pattern.compile("(?i)\\n2ndline", Pattern.DOTALL);
于 2013-07-24T05:02:56.017 回答
0

如果您试图查看"1stLine"字符串中是否存在,"1stline\r\n2ndline\r\n3rdLine"那么您可以执行以下操作:

String test1= "1stline\r\n2ndline\r\n3rdLine";
System.out.println(test1.contains("1stline"));
//returns true

- - - - - - - - - - - - - - 编辑 - - - - - - - - - - - --------

所以由于某种原因 .contains 在你的测试中不起作用。这是查找字符串“1stline”的正则表达式

    String regex = "([\\r\\n]|.)*(1stline)+([\\r\\n]|.)*";

    String test1= "1stline\r\n2ndline\r\n3rdLine";
    System.out.println(test1.contains("1stline"));
    //returns true

    String test2 = "1stline\r\n2ndline\r\n3rdLine";
    System.out.println(test2.matches(regex));
    //returns true

    String test3 = "1stline\r\n";
    System.out.println(test3.matches(regex));
    //returns true

    String test4 = "1stline";
    System.out.println(test4.matches(regex));
    //returns true

    String test5 = "\r\n2ndline\r\n3rdLine";
    System.out.println(test5.matches(regex));
    //returns false

    String test6 = "n2ndlinen2ndlinen2ndline\r\n2ndline\r\n4rdLine";
    System.out.println(test6.matches(regex));
    //returns false
于 2013-07-24T03:19:30.637 回答
0

你可以尝试使用contains

会是这样的

yourString.contains("(.+\\r\\n)+(.)+(wordYouAreLookingFor)");

顺便说一句,使用与@wdziemia 相同的示例,我也不是 REGEX 专家... :)

希望能帮助到你。

于 2013-07-24T04:46:38.887 回答