正则表达式包括所有西班牙字符和数字

6
我有一个Java应用程序,我需要一个正则表达式来替换除字符和数字之外的所有内容(包括强调元音和ñ/Ñ等西班牙字符)。它还需要包括一些特定的特殊字符。
我创建了以下正则表达式,但它也删除了强调元音,这不是想要的。
string.replaceAll("[^-_/.,a-zA-Z0-9 ]+","")

我只想接受那些字符.. 而不是像æ,å或其他字符..


您是否想允许仅特定的字符标记?例如仅ñ/Ñ,或包括äöüèéâ等所有重音符号? - Felk
是的,就是那样...我不想得到其他字符,比如葡萄牙语、法语等。 - Faabass
你不是用 replaceAll("...", "") 来 "接受" 任何内容或者 "获取" 什么,而是要 "移除" 字符。你需要移除什么?请提供一个示例。对于 "łąka123!@#$%^&*()_+",预期输出是什么? - Wiktor Stribiżew
3个回答

7

您可以使用\p{L}而不是a-zA-Z

string = string.replaceAll("[^-_/.,\\p{L}0-9 ]+","");
\p{L} 匹配所有 Unicode 字母,无论在正则表达式编译时传递了哪些修饰符。
请查看此 Java 测试
List<String> strs = Arrays.asList("!@#Łąka$%^", "Word123-)(=+");
for (String str : strs)
    System.out.println("\"" + str.replaceAll("[^-_/.,\\p{L}0-9 ]+","") + "\"");

输出:

"Łąka"
"Word123-"

模式细节: [^-_/.,\\p{L}0-9 ]+ 模式匹配除了 -, _, _, /, ., ,, Unicode 字母,ASCII 数字和空格之外的任何字符。

请注意,使用此解决方案仍会删除 Unicode 数字,例如 ٠١٢٣٤٥٦٧٨٩

您可以使用Mena建议的 \p{Alnum},但必须使用(?U) 嵌入式标志选项来真正匹配所有 Unicode 字母和数字:

string = string.replaceAll("(?U)[^-_/.,\\p{Alnum} ]+","");

如果只想删除非常见欧洲字母以外的Unicode字母,只需添加À-ÿ并从该范围中减去两个非字母字符×÷

string = string.replaceAll("(?U)[^-_/.,A-Za-zÀ-ÿ &&[^×÷]]+","");

是的,但我不想得到Łą或任何其他字符...我会更新问题以使其更清晰,谢谢! - Faabass
@Faabass 我创建了以下正则表达式,但它也删除了重音元音,这不是我的意图 - 我的正则表达式不会删除 łą 等。 - Wiktor Stribiżew
@Faabass 请查看模式细节。 - Wiktor Stribiżew
@Faabass 请尝试另一个建议,.replaceAll("(?U)[^-_/.,A-Za-zÀ-ÿ &&[^×÷]]+","") - Wiktor Stribiżew

1
你可以在字符类[ ... ]中尝试包含西班牙特殊字符,毕竟只有7个。
我只需要小写字母,因此我使用了[a-zñáéíóúü],这对我有效。

0

您可以使用Alnum脚本替换所有字母和数字,包括重音字符:

"[^-_/.,\\p{Alnum} ]+"

请参阅文档

\p{Alnum} 表示字母数字字符:[\p{Alpha}\p{Digit}]

请注意,您当前的替换影响所有字母字符等。

如果您想要实际否定该自定义类(因此替换未在其中定义的所有内容),请使用:

"[^[-_/.,\\p{Alnum} ]]+"

(注意在^后面添加额外的方括号,否则它将被解释为字面上的^)。

编辑

您可以进一步缩小到使用拉丁字符块的子集:

String s = "a1᣹";
System.out.println(
    s.replaceAll("[^[-_/.,\\p{InBASIC_LATIN}\\p{InLATIN_1_SUPPLEMENT}0-9]]+","")
);

输出

Łą

请注意,您仍然会在Latin 1补充中看到一些非西班牙语字符,请参见此处
如果您想进一步限制您的要求,您可能需要定义自己的(冗长的)字符类,并包含特定的西班牙字符。

是的,但我不想得到Łą或任何其他字符...我会更新问题以使其更清晰,谢谢! - Faabass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接