2013-08-20 145 views
1

我試圖構建正則表達式,它將過濾表單字符串中的所有非字母字符,並且如果任何字符串包含單引號,那麼我想保留它作爲規則的例外。帶撇號的字符串的正則表達式

因此,舉例來說,當我進入

car's34 

,結果我想

car's 

當我進入

*&* Lisa's car 0)* 

我想

Lisa's 

此刻我用這個:

string.replaceAll("[^A-Za-z]", "") 

但是,它給了我唯一的字母,並取消了所需的單一配額。

+4

爲什麼你不想在第二個字符串中有'car'? –

+0

我編輯了給出的例子 – Lukasz

+0

第二個例子中的「Lisa's」部分和「car」部分有什麼不同?爲什麼要保留「麗莎」而不是「車」? –

回答

4

這也將刪除不撇號「的一部分,如果詞」:

string = string.replaceAll("[^A-Za-z' ]+|(?<=^|\\W)'|'(?=\\W|$)", "") 
    .replaceAll(" +", " ").trim(); 

這首先簡單地增加一個撇號到要保持字符的列表,而是使用看變通找不中的話撇號,所以

I'm a ' 123 & 'test' 

將成爲

I'm a test 

請注意如何去除孤立撇號以及撇號test,但保留I'm


隨後replaceAll()是具有單一的空間,這將導致,如果有在輸入一個孤撇號來替代多個空格。如果在輸入結束時發生了進一步的呼叫,則添加trim()

這是一個測試:

String string = "I'm a ' 123 & 'test'"; 
string = string.replaceAll("[^A-Za-z' ]+|(?<=^|\\W)'|'(?=\\W|$)", "").replaceAll(" +", " ").trim(); 
System.out.println(string); 

輸出:

I'm a test 
+0

這一個實際上拋出一個例外,無論如何感謝 – Lukasz

+0

哎呦 - 遺漏了一個「=」。現在試試! – Bohemian

+0

Acutally這一個比以前更好!謝謝。 – Lukasz

2

明顯的解決辦法是:

string.replaceAll("[^A-Za-z']", "") 

我懷疑你想要更多的東西。

+0

我想知道的是,你想讓'12'猿'45'變成'猿'還是'猿'? –

4

這不是工作?

[^A-Za-z']

+0

這正是我所期待的!我不相信我錯過了這個!謝謝RP – Lukasz

2

您可以嘗試正則表達式:

[^\p{L}' ] 

\p{L}表示的Unicode字母的類別。

在ahother手,你需要使用模式爲避免恆定編譯表達每一次,這樣的事情:

private static final Pattern REGEX_PATTERN = 
     Pattern.compile("[^\\p{L}' ]"); 

public static void main(String[] args) { 
    String input = "*&* Lisa's car 0)*"; 

    System.out.println(
     REGEX_PATTERN.matcher(input).replaceAll("") 
    ); // prints " Lisa's car " 
} 
1

@Bohemian有一個好主意,但字邊界呼籲,而不是環視:

string.replaceAll("([^A-Za-z']|\B'|'\B)+", " "); 
+0

什麼是'\ B'碎片? –

+0

\ b匹配一個單詞邊界,\ B匹配一個非單詞邊界 – pguardiario

相關問題