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"
.
问题是 matcher
和 matcher2
都在这个字符串上工作。
我想要的是:
一个只得到 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
场景:
Pattern whitespace = Pattern.compile("^\s");
matcher = whitespace.matcher(" WhiteSpace");
Pattern whitespace2 = Pattern.compile("^\s\s");
matcher2 = whitespace2.matcher(" WhiteSpace");
我试图在一行的开头得到白色spaces。我想获得确切数量的白色 spaces 匹配器为真。我的字符串是 " WhiteSpace"
.
问题是 matcher
和 matcher2
都在这个字符串上工作。
我想要的是:
一个只得到 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