Kelimeler gibi metnini ararken ben bir daha da kötüsü sorun koştu .NET
, C++
, C#
, ve C
. Bilgisayar programcılarının, bir dile düzenli ifadeler yazması zor bir şeyi adlandırmaktan daha iyi bileceğini düşünürsünüz.
Her neyse, öğrendiğim şey buydu (çoğunlukla harika bir site olan http: //www.regular-expressions.info'dan özetlenmiştir ): Çoğu normal ifade çeşidinde, kısa el karakter sınıfıyla eşleşen karakterler \w
şunlardır: kelime sınırlarına göre kelime karakterleri olarak değerlendirilen karakterler. Java bir istisnadır. Java, Unicode'u destekler, \b
ancak için desteklemez \w
. (Eminim o sırada bunun iyi bir nedeni vardır).
\w
"Kelime karakteri" anlamına gelir. Her zaman ASCII karakterleriyle eşleşir [A-Za-z0-9_]
. Alt çizgi ve rakamların eklendiğine dikkat edin (ancak tire değil!). Unicode'u destekleyen çoğu tatta \w
, diğer komut dosyalarından birçok karakter bulunur. Gerçekte hangi karakterlerin dahil edildiği konusunda pek çok tutarsızlık var. Alfabetik yazılardan ve ideograflardan gelen harfler ve rakamlar genellikle dahil edilir. Rakam olmayan alt çizgi ve sayısal semboller dışındaki bağlayıcı noktalama işaretleri dahil edilebilir veya edilmeyebilir. XML Şeması ve XPath tüm sembolleri \w
. Ancak Java, JavaScript ve PCRE yalnızca ASCII karakterleriyle eşleşir \w
.
İçin regex aramalar Java tabanlı yüzden hangisi C++
, C#
ya .NET
(eğer süresi ve artılar kaçmayı unutmayın bile) tarafından vidalanır \b
.
Not: Birisinin cümlenin sonunda bir noktadan sonra boşluk bırakmaması gibi, metindeki hatalar konusunda ne yapacağımı bilmiyorum. Buna izin verdim, ancak bunun mutlaka yapılacak doğru şey olduğundan emin değilim.
Her neyse, Java'da, tuhaf adlandırılmış diller için metin arıyorsanız, \b
beyaz boşluk ve noktalama işaretçilerinden önce ve sonra yazmanız gerekir . Örneğin:
public static String grep(String regexp, String multiLineStringToSearch) {
String result = "";
String[] lines = multiLineStringToSearch.split("\\n");
Pattern pattern = Pattern.compile(regexp);
for (String line : lines) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
result = result + "\n" + line;
}
}
return result.trim();
}
Ardından testinizde veya ana işlevinizde:
String beforeWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|^)";
String afterWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|$)";
text = "Programming in C, (C++) C#, Java, and .NET.";
System.out.println("text="+text);
// Here is where Java word boundaries do not work correctly on "cutesy" computer language names.
System.out.println("Bad word boundary can't find because of Java: grep with word boundary for .NET="+ grep("\\b\\.NET\\b", text));
System.out.println("Should find: grep exactly for .NET="+ grep(beforeWord+"\\.NET"+afterWord, text));
System.out.println("Bad word boundary can't find because of Java: grep with word boundary for C#="+ grep("\\bC#\\b", text));
System.out.println("Should find: grep exactly for C#="+ grep("C#"+afterWord, text));
System.out.println("Bad word boundary can't find because of Java:grep with word boundary for C++="+ grep("\\bC\\+\\+\\b", text));
System.out.println("Should find: grep exactly for C++="+ grep(beforeWord+"C\\+\\+"+afterWord, text));
System.out.println("Should find: grep with word boundary for Java="+ grep("\\bJava\\b", text));
System.out.println("Should find: grep for case-insensitive java="+ grep("?i)\\bjava\\b", text));
System.out.println("Should find: grep with word boundary for C="+ grep("\\bC\\b", text)); // Works Ok for this example, but see below
// Because of the stupid too-short cutsey name, searches find stuff it shouldn't.
text = "Worked on C&O (Chesapeake and Ohio) Canal when I was younger; more recently developed in Lisp.";
System.out.println("text="+text);
System.out.println("Bad word boundary because of C name: grep with word boundary for C="+ grep("\\bC\\b", text));
System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
// Make sure the first and last cases work OK.
text = "C is a language that should have been named differently.";
System.out.println("text="+text);
System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
text = "One language that should have been named differently is C";
System.out.println("text="+text);
System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
//Make sure we don't get false positives
text = "The letter 'c' can be hard as in Cat, or soft as in Cindy. Computer languages should not require disambiguation (e.g. Ruby, Python vs. Fortran, Hadoop)";
System.out.println("text="+text);
System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
Not: http://regexpal.com/ 'a teşekkürler, kim olmadan regex dünyası çok perişan olurdu!