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