对Java中模式匹配的困惑

时间:2016-11-12 19:17:16

标签: java regex

所以我将字符串与以下模式进行比较:

"\"([a-zA-Z]*)\""

我认为这意味着它只允许使用以下字符串:

  • 开头只有一个引号 - \",
  • 最后一个引号, - \" - 和;
  • 中间任意数量的小写或大写字母 - ([a-zA-Z] *)

我问这个是因为这是我在搜索StackOverflow和互联网后所得到的。但是当我给它一个空字符串时,matches()方法不会抛出PatternSyntaxException。我的意思是:

|""|  //This is valid or is meant to be

||    //This is invalid or is meant to be

有人关心开导我吗?对于上下文,这是在Java中。

编辑:大家好,我与正则表达式匹配的字符串确实有引号(我要求用户输入用引号括起来的消息)。我想写的代码是:

if(!(components[MESSAGE].matches("^\\"([a-zA-Z]*)$\\"")))
            throw new InvalidSyntaxException("  > ERROR: Message must be surrounded by quotation marks.");

其中' InvalidSyntaxException'是一个自定义异常类。

一些例子:

|""| - valid
||   - invalid (quotes required)
|"Example"| - valid
|"The year is 1995"| - invalid (no numbers)

解决:你没事 - 我的代码唯一没做的就是在消息中留出空格!这就是为什么它一直在抱怨。再次感谢!

5 个答案:

答案 0 :(得分:1)

您可能希望删除正则表达式两端的"

\"([a-zA-Z]*)\"

我建议你使用regex101来测试你的正则表达式。

编辑:正如其他答案中所说,你需要在使用之前编译模式:

Pattern pattern = Pattern.compile("\"([a-zA-Z]*)\"")
if(!pattern.matches(components[MESSAGE]))
        throw new InvalidSyntaxException("  > ERROR: Message must be surrounded by quotation marks.");

答案 1 :(得分:1)

要在字符串的开头结束\",请使用^$

^\"([a-zA-Z]*)\"$

这应该只找到以"开头和结尾的匹配项。

答案 2 :(得分:1)

所以抛出PatternSyntaxException“表示正则表达式模式中的语法错误。”我不希望你通过检查空字符串来获得它。

你可能反驳了这些论点吗? (您尚未发布代码。)

您应该将正则表达式传递给att1。然后,您将要签出的字符串传递给...

Patter.compile()

或者,如果您使用myPattern.matcher("my_string").matches(); ,则首先使用正则表达式模式。

答案 3 :(得分:1)

与各种解析方法不同,如果输入与模式不匹配,matches()不会抛出异常,它只返回truefalse

像这样使用:

if (input.matches("\"[a-zA-Z]*\""))
    // input is OK

请注意,括号是不必要的(因为它们与^暗示为$或尾随matches()

答案 4 :(得分:0)

希望这段代码有用。

centered

打印

public class Foo {
  static void check(String s) {
    System.out.println("Match |" + s + "| = " 
        + Pattern.matches("\"([a-zA-Z]*)\"", s));
  }

  public static void main(String[] args) {
    check("\"foo\""); // Should be true
    check("\"123\""); // Should be false
    check("\"\""); // should be true
    check("foo"); // Should be false
    check(""); // Should be false
  }
}