正则表达式禁止文件名中的字符

时间:2015-10-29 17:50:59

标签: java android regex

我正在尝试在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

3 个答案:

答案 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,因为它会尝试匹配完整输入。在PatternMatcher 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");

RegEx Demo

答案 2 :(得分:0)

你必须在字符串的两端使用^和$来使用完整的字符串匹配 如下: filename.matches(“^ [^ a-zA-Z0-9æøåÆØÅ_ - ] + $”);