Java 模式用法

Java pattern usage

场景:

Pattern whitespace = Pattern.compile("^\s");
matcher = whitespace.matcher("  WhiteSpace");

Pattern whitespace2 = Pattern.compile("^\s\s");
matcher2 = whitespace2.matcher("  WhiteSpace");

我试图在一行的开头得到白色spaces。我想获得确切数量的白色 spaces 匹配器为真。我的字符串是 " WhiteSpace".
问题是 matchermatcher2 都在这个字符串上工作。

我想要的是:
一个只得到 1 个白色 space 的模式,但这个模式应该不起作用 对于 2 个白色 space 字符串。在下面的场景中,matcher.find()matcher2.find() 都为真。但是matcher.find()应该是假的,matcher2.find()应该是真的。

我希望匹配器对于 " WhiteSpace" 为真,对于 " WhiteSpace" 为假(两个 spaces)
我希望 matcher2 为真:" WhiteSpace".


我想做的事情是;
我有一个字符串 " two whitespaces".
下面两个 if 语句都为真。 matcher 应该是错误的。 matcher2应该是真的。

Pattern whitespace = Pattern.compile("^\s");
matcher = whitespace.matcher("  two whitespaces");

Pattern whitespace2 = Pattern.compile("^\s\s");
matcher2 = whitespace2.matcher("  two whitespaces");

if(matcher.find()==true){
    //XXXXXXXXXXX
} else if(matcher2.find()==true){
    //YYYYYYYYYYY
}

如果你想确保在一个空格之后没有另一个空格,但你实际上不想包含你将在匹配中测试的第二个字符(不管它是否是空格),你可以使用 negative lookahead 机制 (?!..)

因此,如果模式之后没有另一个空格,则它只能匹配行首的空格,它可能看起来像

Pattern whitespace = Pattern.compile("^\s(?!\s)");

这可以通过空格适应任何数字

Pattern whitespace = Pattern.compile("^\s{3}(?!\s)");

模式在这里可能有点矫枉过正*。使用 Character.isWhitespace 并获得更简单的代码:

String in = "   your input here";
int wsPrefix=0;
for ( ; wsPrefix < in.length() && Character.isWhitespace(in.charAt(wsPrefix)) ;
      wsPrefix++ ) {}
System.out.println("wsPrefix = " + wsPrefix);

* 因为据说:

"Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems. -- Jaimie Zawinski, 1997