我正在尝试构建正则表达式,它将过滤表单字符串中的所有非字母字符,如果任何字符串包含单引号,那么我想将其保留为规则的例外。
所以例如当我输入
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)
但是,它只给了我字母表,并删除了所需的单个配额。
这也将删除不是“部分如果词”的撇号:
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)