带撇号的字符串的正则表达式

Luk*_*asz 2 java regex string

我正在尝试构建正则表达式,它将过滤表单字符串中的所有非字母字符,如果任何字符串包含单引号,那么我想将其保留为规则的例外。

所以例如当我输入

car's34
Run Code Online (Sandbox Code Playgroud)

结果我想得到

car's
Run Code Online (Sandbox Code Playgroud)

当我进入

*&* Lisa's car 0)*
Run Code Online (Sandbox Code Playgroud)

我想得到

Lisa's
Run Code Online (Sandbox Code Playgroud)

目前我使用这个:

string.replaceAll("[^A-Za-z]", "")
Run Code Online (Sandbox Code Playgroud)

但是,它只给了我字母表,并删除了所需的单个配额。

Rom*_*lus 5

这不工作吗?

[^A-Za-z']


Boh*_*ian 5

这也将删除不是“部分如果词”的撇号:

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

这首先简单地将撇号添加到要保留的字符列表中,但使用环顾来查找不在单词中的撇号,因此

I'm a ' 123 & 'test'
Run Code Online (Sandbox Code Playgroud)

会成为

I'm a test
Run Code Online (Sandbox Code Playgroud)

请注意单独的撇号是如何被移除的,以及撇号是如何包装的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);
Run Code Online (Sandbox Code Playgroud)

输出:

I'm a test
Run Code Online (Sandbox Code Playgroud)