2016-11-12 83 views
0

与下面的模式所以我比较字符串:混乱了Java中的模式匹配

"\"([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) 

解决:你都是对的 - 我的代码没有做的唯一的事情就是允许邮件里面的空间!这就是为什么它不断抱怨。再次感谢!

+2

我不知道为什么你会认为'匹配()'应该抛出一个异常。它只在一个无效的模式上做,而不是如果它不匹配字符串。任何数字都不包含任何数字,所以'“”'是一个有效的匹配。 – UnholySheep

+2

您需要检查'matches'的'boolean'返回值,不要期待异常。只有在 - 正如其名称所述 - 正则表达式的语法错误时才引发异常。你的语法看起来很好。 – Gene

+0

@Gene,那么错误的语法和语法之间的区别是什么?就像从简单的“虚假”而不是抛出异常一样。 –

回答

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."); 
+0

嗨,我想包括引号! –

+0

你的意思是你想匹配''string“'或'”“string”“'? –

+0

查看编辑回答你的问题! –

1

要在年底断言\"字符串的开始,使用^$

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

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

+0

恐怕我刚刚尝试过,祝你好运!它仍然通过测试。 –

+0

另外,用引号包裹这个正则表达式引发了来自Java的抱怨。以下行无效: String regex =“^ \\”([a-zA-Z] *)$ \\“”; –

+0

@DanielSoutar是的,这是一个错误 – ItamarG3

1

所以PatternSyntaxException被抛出,以指示正则表达式模式中的语法错误。我不希望你可以通过检查一个空字符串来得到它。

你也许有反对意见吗? (您还未发布您的代码。)

您应该将您的正则表达式传递给Patter.compile()。然后你传递你想要检查的字符串......

myPattern.matcher("my_string").matches(); 

或者如果您使用的是static boolean matches(String regex, CharSequence input),则正则表达式模式是第一个。

1

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

使用方法如下:

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

注意,括号是不必要的(如将是一个领先的^或尾随$因为它们与matches()暗示)。

+0

其实我想要包括引号,所以“”将是有效的 –

+0

@dan然后,请参阅我认为你错过的编辑答案。 – Bohemian

0

希望这段代码很有帮助。

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 
    } 
} 

它打印

Match |"foo"| = true 
Match |"123"| = false 
Match |""| = true 
Match |foo| = false 
Match || = false