2013-04-30 78 views
2

如何为“空字符串”或“创建的新条目”指定正则表达式模式是一个子字符串“?如何将模式与完整的字符串进行匹配?

我上的图案试图(new entry created|)Matcher.find()为真像输入:

无效水平

有效电平的范围为0-14

”。

这是做直接的编程一样

String.isEmpty() || String.contains("new entry created") 

,因为同样的方法会有不同的图案作为输入的选项。换句话说,我需要在这种情况下使用正则表达式。 我想坚持使用Matcher.find(),因为我会使用其他错误模式 - 例如“无效”。

+0

http://stackoverflow.com/a/3164471/738746 – 2013-04-30 03:07:44

+0

岂不'String.contains( “new entry created”)'如果'new entry created'是'String'的一个子串,那么它也匹配吗? – 2013-04-30 08:02:54

+0

@TimPietzcker匹配一个子字符串很好 – likejiujitsu 2013-04-30 14:40:12

回答

1

如果您的要求实际上是要么

  • 包含new entry created
  • 一个字符串匹配一个空字符串

那么你可以使用

^(?:.*new entry created.*)?$ 

或者(如果你的字符串可能包含换行符)

(?s)^(?:.*new entry created.*)?$ 

在Java中,你有.matches()方法,你可以删除锚点:

Pattern regex = Pattern.compile("(?:.*new entry created.*)?", Pattern.DOTALL); 
Matcher regexMatcher = regex.matcher(subjectString); 
foundMatch = regexMatcher.matches(); 
+0

当你说,“如果你的字符串可能包含换行符”,我假设你的意思是输入字符串;是的,输入字符串包含换行符。但只要“新入门”在一条线上,它是否仍然重要? – likejiujitsu 2013-04-30 21:14:34

+0

我测试了这一点,它的工作。 – likejiujitsu 2013-05-03 22:54:14

+0

@likejiujitsu:我不知何故错过了你之前的问题。是的,这很重要;如果没有'(?s)'(或'Pattern.DOTALL'),点('.')将不匹配换行符,导致匹配失败。 – 2013-05-04 06:43:55

3

您只需将“空”部分包围与开始年底分隔符,以您的搜索限制在输入的准确匹配:

(new entry created|^$) 
+0

好...我从来不知道我们可以这样做... – Buddha 2013-04-30 03:12:37

+0

@Vulcan匹配一个子字符串很好 – likejiujitsu 2013-04-30 14:41:48

+0

@likejiujitsu糟糕,我误解了这个要求。编辑答案。 – Vulcan 2013-04-30 15:10:15

1

您好尝试这种模式...

(new entry created)|(^$) 

我已经测试此代码

public static void main(String[] argv) { 
    String pattern = "(new entry created)|(^$)"; 
    String input = ""; 
    Pattern p = Pattern.compile(pattern); 
    boolean found = p.matcher(input).lookingAt(); 
    System.out.println("'" + pattern + "'" 
      + (found ? " matches '" : " doesn't match '") + input + "'"); 
} 
+0

正则表达式似乎是正确的,但你应该坚持'find()'方法。它允许匹配发生在字符串中的任何地方(这是OP似乎想要的),而'lookingAt()'将匹配锚定到字符串的开头。事实上,我建议你从不*使用'lookingAt()'。与明确的锚点相比,它没有增加真正的价值,而且它很少被使用,所以每次重新访问代码时都可能需要查看它。 :D – 2013-04-30 15:50:31

+0

感谢您的建议,但我刚刚从我的一些旧练习代码复制来测试我的正则表达式是否工作。顺便说一句,这个明确的锚点是什么?从来没有听说过。 – Buddha 2013-04-30 17:30:33

+0

我正在讨论在正则表达式中使用锚(例如'^ ... $'或'\ A ... \ Z'),而不是依赖*应用正则表达式来锚定它的方法。事实上,我建议您始终使用锚点,无论您使用哪种方法。这样,任何试图了解正则表达式的人都会在一个地方找到他们需要的所有信息:正则表达式本身。当然还有修饰符标志,但其中大部分可以以内联修饰符的形式移动到正则表达式中,例如, '(?m)'或'(?i)'。 – 2013-04-30 19:49:52

2

您的模式很好(对于Java),只需使用Matcher.matches()而不是Matcher.find()

Class Matcher documentation

  • matches方法试图匹配针对图案的整个输入序列。

  • lookingAt方法尝试从输入序列开始匹配模式。

  • find方法扫描输入序列,寻找与模式匹配的下一个子序列。

所以,问题是,find方法将在任何字符串中找到您的空字符串替代。要在Java中查找完全匹配,请使用matches()方法。

+0

一个更好的正则表达式会是'(创建新条目)'(或'(?:新创建的条目)'),这使得“全部或全部”要求更加明确。 – 2013-04-30 08:01:31

+0

@stema我更喜欢使用find(),因为我的字符串可能是一个子字符串。 – likejiujitsu 2013-04-30 21:18:01

相关问题