2017-07-11 33 views
0

我想用Pattern的編譯方法來做到這一點。如使用通用語言支持去除所有非字母數字字符的正則表達式?

String text = "Where? What is that, an animal? No! It is a plane."; 
Pattern p = new Pattern("*some regex here*"); 
String delim = p.matcher(text).replaceAll(""); 

什麼是可以做我想要完成的正則表達式?

例字符串:

英語

Input: "Where? What is that, an animal? No! It is a plane." 
Output: "Where What is that an animal No It is a plane" 

西班牙

Input: "¿Dónde? ¿Qué es eso, un animal? ¡No! Es un avión." 
Output: "Dónde Qué es eso un animal No Es un avión" 

葡萄牙

Input: "Onde? O que é isso, um animal? Não! É um avião." 
Output: "Onde O que é isso um animal Não É um avião" 

希望的例子說清楚什麼,我試圖完成。 謝謝大家!

+0

這暗示普通話是沒有意義的,因爲字符既不是元音也不是字母,而是合乎邏輯的聲音。至於你給我們的浪漫語言例子,你可能不得不手動列出所有事情。 –

+0

每種語言都有自己的符號,它們出現在ASCII表格的不同位置。此外,您需要檢查它的細節並創建適當的連鎖,如[^ a-zA-Z0-9] –

+0

非字母數字是\ W(除非您不想強調下劃線) – Vivick

回答

1

Java的Pattern類,它是Java實現正則表達式,支持Unicode Categories,例如\p{Lu}。既然你想要字母數字,那將是CategoriesL(Letter)和N(Number)。

由於您的示例顯示您還想保留空格,因此需要包含該空格。我們使用Predefined Character Class\s,這樣您也可以保留換行符和製表符。

要找到任何東西,但指定的字符,請使用Negation Character Class[^abc]

所有功能於一切,這意味着[^\s\p{L}\p{N}]

String output = input.replaceAll("[^\\s\\p{L}\\p{N}]+", ""); 
Where What is that an animal No It is a plane 
Dónde Qué es eso un animal No Es un avión 
Onde O que é isso um animal Não É um avião 

還是看regex101.com的演示。


當然,有多種方法可以做到這一點。

您也可以使用POSIX Character Class\p{Alnum},然後啓用UNICODE_CHARACTER_CLASS,使用(?U)

String output = input.replaceAll("(?U)[^\\s\\p{Alnum}]+", ""); 
Where What is that an animal No It is a plane 
Dónde Qué es eso un animal No Es un avión 
Onde O que é isso um animal Não É um avião 

現在,如果你不想空間,這可能是通過使用\P{xx}而不是簡單:

String output = input.replaceAll("(?U)\\P{Alnum}+", ""); 
WhereWhatisthatananimalNoItisaplane 
DóndeQuéesesounanimalNoEsunavión 
OndeOqueéissoumanimalNãoÉumavião 
+0

謝謝你。非常詳細,我很欣賞它。還有一個問題 - 是否可以做你創建的東西,但是使用Pattern類呢?在處理大型數據集和多次迭代時,我聽到了有關使用String.replaceAll()的壞消息。 Pattern.compile允許你只聲明一次正則表達式,而不是每次迭代。如果你知道我可以這樣做,請讓我知道!謝謝 –

+0

@JimmyLee ['replaceAll()']的javadoc(https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java .lang.String-)表示你需要知道的一切:*調用形式爲'str.replaceAll(regex,repl)'的這種方法產生與表達式'Pattern.compile(regex).matcher完全相同的結果STR).replaceAll(REPL)'* – Andreas

1

我不是在世界上所有的語言專家,但是,你的要求可以由特定語言的基礎上,這樣滿足:

Regex rgx = new Regex("[^a-zA-Z0-9 <put language specific characters to preserve here>]"); 
str = rgx.Replace(str, ""); 

我講英語和韓語,可以告訴你韓語中的標點符號與英語中的標點符號相同。如上所示,您可以添加應該保留的字符,而不是特定語言的標點符號。例如,我們假設代字號不應被視爲標點符號。然後使用正則表達式:

[^a-zA-Z0-9 ~] 
相關問題