我正在尝试在Android应用程序的String
中构建禁止某些字符的正则表达式。也就是说,如果任何字符在一组允许的字符中不,我应该能够知道。我的允许的字符是:
"a-zA-Z0-9æøåÆØÅ_ -"
用户输入我要检查的名称。我目前对此的看法是:
filename.matches("^((?![a-zA-Z0-9æøåÆØÅ_ -]).)*$");
基于this回答。对于所有输入,此正则表达式返回false
,除非不允许所有字符,这不是我想要的。我也试过一个更简单的正则表达式
filename.matches("([^a-zA-Z0-9æøåÆØÅ_ -])");
尝试匹配捕获组中的任何不,但这也无法正常工作。
我错过了什么?在这种特殊情况下,Java正则表达式引擎中是否有任何怪癖或特殊内容?
所提供的正则表达式都没有给出所需的结果。考虑这些例子。当字符串包含接受和未接受的字符时,它无法产生正确的结果。 Python中的结果是一样的。然而,当将下面的两个正则表法粘贴到https://regex101.com/时,后者似乎按预期工作。但事实并非如此。我也尝试将捕获组(即parantheses)添加到正则表达式,但无济于事。
String foo1 = "this_is_a_filename";
String foo2 = "this%is%not%a%filename";
String foo3 = "%+!?";
String regex1 = "^[^a-zA-Z0-9æøåÆØÅ_ -]+$";
String regex2 = "[^a-zA-Z0-9æøåÆØÅ_ -]+";
boolean isMatch;
isMatch = foo1.matches(regex1); // false, ok
isMatch = foo2.matches(regex1); // false, should be true
isMatch = foo3.matches(regex1); // true, ok
isMatch = foo1.matches(regex2); // false, ok
isMatch = foo2.matches(regex2); // false, should be true
isMatch = foo3.matches(regex2); // true, ok
答案 0 :(得分:3)
您需要正则表达式来匹配无效的字符。这是对允许的字符集的否定:[^a-zA-Z0-9æøåÆØÅ_ -]
并使用Matcher#find方法:
public boolean find()
匹配时才返回true
试图找到下一个子序列 与模式匹配的输入序列。
返回:当且仅当输入序列的子序列与此匹配器的模式
示例:
String foo1 = "this_is_a_filename";
String foo2 = "this%is%not%a%filename";
String foo3 = "%+!?";
String regex = "[^a-zA-Z0-9æøåÆØÅ_ -]";
Pattern p = Pattern.compile(regex);
System.out.println("Foo1: " + p.matcher(foo1).find());
System.out.println("Foo2: " + p.matcher(foo2).find());
System.out.println("Foo3: " + p.matcher(foo3).find());
输出:
Foo1: false
Foo2: true
Foo3: true
Ideone演示:https://ideone.com/S36DYF
答案 1 :(得分:1)
请勿使用String#matches
,因为它会尝试匹配完整输入。在Pattern
和Matcher
API中使用此字符串:
String regex = "[\\wæøåÆØÅ -]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.find())
System.out.println("Input has at least one valid char");
答案 2 :(得分:0)
你必须在字符串的两端使用^和$来使用完整的字符串匹配 如下: filename.matches(“^ [^ a-zA-Z0-9æøåÆØÅ_ - ] + $”);