在正規表示式可用^
(caret)符號來排除後接的字元。^
是正規表示式的metacharacter(metacharacter的中文翻譯很多,例如元字符,中繼字符,特用字符,特殊自元,詮譯字元,中介字元等)
注意^
要包在方括弧中並緊接於左方刮弧後時才代表排除,例如[^...]
,否則表示字串的起點。
觀察以下...
String str = new String("hello");
String regex1 = "^hello";
Pattern p1 = Pattern.compile(regex1);
System.out.println(p1.matcher(str).matches()); // true
String regex2 = "[^hello]";
Pattern p2 = Pattern.compile(regex2);
System.out.println(p2.matcher(str).matches()); // false
System.out.println(p2.matcher("h").matches()); // false 雖然是1個字,但為h
System.out.println(p2.matcher("he").matches()); // false 超過1個字, 且2字皆為h,e,l,o中的字元
System.out.println(p2.matcher("e").matches()); // false 雖然是1個字,但為e
System.out.println(p2.matcher("ac").matches()); // false 雖然a,c皆不為h,e,l,o中的任一字元,但超過2個字
System.out.println(p2.matcher("b").matches()); // true 1個字,且不為h,e,l,o中的任一字元
上面範例中的第一個Pattern p1檢查字串("hello")是否以"hello"開頭,所以結果為true。
p2檢查字串是否只有一個字且不為h,e,l,l,o中的任一字元,所以為false。特別注意這邊的匹配方法是matches()
,不是find()
,兩個方法的差異請參考Regex matches()和find()的差異
^
精確的說是匹配被排除字元以外的字元,請看以下...
String str1 = new String("jerry");
String str2 = new String("john");
String str3 = new String("jajo");
String regex = "j[^o]";
Pattern p = Pattern.compile(regex);
System.out.println(p.matcher(str1).find()); // true
System.out.println(p.matcher(str2).find()); // false
System.out.println(p.matcher(str3).find()); // true
上面的regex的意思是,找出字串中有"j"及後面緊接除了"o"之外的任何字元。
"jeff"的"je"符合條件,所以為true。
"john"的第一個字為"j",但第二個字為"o",因為條件是o以外的任意字元,所以不批配為false。
"jajo"的"ja"符合條件,雖然後面的"jo"不符合條件,但find()
只要有找到一個符合就會回傳true。
菜鳥工程師肉豬
若要檢查全部字串中是否不含某特定字串,請看以下
String str1 = new String("hello world");
String str2 = new String("world hello");
String str3 = new String("the world wryyyy");
String regex = "^(?!.*hello)";
Pattern p = Pattern.compile(regex);
System.out.println(p.matcher(str1).find()); // false
System.out.println(p.matcher(str2).find()); // false
System.out.println(p.matcher(str3).find()); // true
被檢查字串中如有出現"hello",則回傳false
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
沒有留言:
張貼留言