我正在尝试构建正则表达式,它将过滤表单字符串所有非字母字符,如果任何字符串包含单引号,那么我想将它作为规则的例外。
所以例如我输入
car's34
因此我想得到
car's
当我进入
*&* Lisa's car 0)*
我想要
Lisa's
目前我用这个:
string.replaceAll("[^A-Za-z]", "")
然而,它只给我字母表,并删除了所需的单个配额。
答案 0 :(得分:4)
这不起作用吗?
[^A-Za-z']
答案 1 :(得分: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
答案 2 :(得分:2)
显而易见的解决方案是:
string.replaceAll("[^A-Za-z']", "")
我怀疑你想要更多东西。
答案 3 :(得分:2)
您可以尝试使用正则表达式:
[^\p{L}' ]
\p{L}
表示Unicode字母的类别。
另一方面,你需要使用Pattern的常量来避免每次都重新编译表达式,如下所示:
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 "
}
答案 4 :(得分:1)
@Bohemian有一个好主意但是要求使用单词边界而不是环顾:
string.replaceAll("([^A-Za-z']|\B'|'\B)+", " ");