網頁

2017/8/15

Regex 使用 ^ 符號排除特定字元

在正規表示式可用^(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廣告,感恩。

沒有留言:

張貼留言