我試圖構建正則表達式,它將過濾表單字符串中的所有非字母字符,並且如果任何字符串包含單引號,那麼我想保留它作爲規則的例外。帶撇號的字符串的正則表達式
因此,舉例來說,當我進入
car's34
,結果我想
car's
當我進入
*&* Lisa's car 0)*
我想
Lisa's
此刻我用這個:
string.replaceAll("[^A-Za-z]", "")
但是,它給了我唯一的字母,並取消了所需的單一配額。
我試圖構建正則表達式,它將過濾表單字符串中的所有非字母字符,並且如果任何字符串包含單引號,那麼我想保留它作爲規則的例外。帶撇號的字符串的正則表達式
因此,舉例來說,當我進入
car's34
,結果我想
car's
當我進入
*&* Lisa's car 0)*
我想
Lisa's
此刻我用這個:
string.replaceAll("[^A-Za-z]", "")
但是,它給了我唯一的字母,並取消了所需的單一配額。
這也將刪除不撇號「的一部分,如果詞」:
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
明顯的解決辦法是:
string.replaceAll("[^A-Za-z']", "")
我懷疑你想要更多的東西。
我想知道的是,你想讓'12'猿'45'變成'猿'還是'猿'? –
您可以嘗試正則表達式:
[^\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 "
}
@Bohemian有一個好主意,但字邊界呼籲,而不是環視:
string.replaceAll("([^A-Za-z']|\B'|'\B)+", " ");
什麼是'\ B'碎片? –
\ b匹配一個單詞邊界,\ B匹配一個非單詞邊界 – pguardiario
爲什麼你不想在第二個字符串中有'car'? –
我編輯了給出的例子 – Lukasz
第二個例子中的「Lisa's」部分和「car」部分有什麼不同?爲什麼要保留「麗莎」而不是「車」? –