Java 用于禁止在文件名中使用字符的正则表达式

Java 用于禁止在文件名中使用字符的正则表达式,java,android,regex,Java,Android,Regex,我正在尝试构建一个正则表达式,在Android应用程序中禁止字符串中的某些字符。也就是说,如果任何字符不在允许的字符集中,我应该能够知道。我允许的字符是: "a-zA-Z0-9æøåÆØÅ_ -" 用户键入了我要检查的名称。我目前的看法是: filename.matches("^((?![a-zA-Z0-9æøåÆØÅ_ -]).)*$"); 根据答案。这个正则表达式对所有输入返回false,除非所有字符都不允许,这不是我想要的。我还尝试了一个更简单的正则表达式 filename.match

我正在尝试构建一个正则表达式,在Android应用程序中禁止
字符串中的某些字符。也就是说,如果任何字符不在允许的字符集中,我应该能够知道。我允许的字符是:

"a-zA-Z0-9æøåÆØÅ_ -"
用户键入了我要检查的名称。我目前的看法是:

filename.matches("^((?![a-zA-Z0-9æøåÆØÅ_ -]).)*$");
根据答案。这个正则表达式对所有输入返回
false
,除非所有字符都不允许,这不是我想要的。我还尝试了一个更简单的正则表达式

filename.matches("([^a-zA-Z0-9æøåÆØÅ_ -])");
尝试匹配不在捕获组中的任何内容,但这也没有达到预期效果

我错过了什么?在这种特殊情况下,JavaRegex引擎中是否有任何怪癖或特殊之处

例子 提供的正则表达式中没有一个给出所需的结果。考虑这些例子。当字符串同时包含接受字符和不接受字符时,将无法生成正确的结果。结果在Python中是相同的。然而,当将下面的两个正则表达式粘贴到中时,后者似乎如预期的那样工作。但事实并非如此。我还尝试向正则表达式中添加捕获组(即paranthes),但没有成功

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

您必须在字符串的两端使用“^”和“$”进行完整字符串匹配 详情如下: filename.matches(“^[^a-zA-Z0-9æåÆØØØØ-]+$”

不要使用
String#matches
,因为它试图匹配完整输入。在
模式
匹配器
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");

您需要一个正则表达式来匹配无效字符。这是允许字符集的否定:

使用方法:

公共布尔查找() 尝试查找的下一个子序列 与模式匹配的输入序列

当且仅当输入序列的子序列匹配此匹配器的模式时返回: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 demo:

好吧,我想你可以使用
^
$
锚定,但就我所知,在这种情况下这并不重要。我更新了我的帖子,列举了一些有用和无用的例子。