Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在一个术语中匹配任意数量的特定字符?_Java_Regex - Fatal编程技术网

Java 是否可以在一个术语中匹配任意数量的特定字符?

Java 是否可以在一个术语中匹配任意数量的特定字符?,java,regex,Java,Regex,我有一些试图匹配的用户输入,但是我去掉了一些特殊字符,如“^-等。我想知道是否可以提供一组特定的字符来匹配或“忽略”。因此,如果列表包含“^-”,且术语为PRM,P^^R-^M将是匹配项,但PROM将不匹配,因为O不在“允许”字符集中 正则表达式是否可以这样做?使用Java 8,您可以使用表示一个或多个特殊字符的字符组来连接术语中的单个字符,例如类似于[^-]*,但使用正则表达式特殊字符转义 String term = "PRM"; String special = "^-"; String

我有一些试图匹配的用户输入,但是我去掉了一些特殊字符,如
“^-
等。我想知道是否可以提供一组特定的字符来匹配或“忽略”。因此,如果列表包含
“^-”
,且术语为
PRM
P^^R-^M
将是匹配项,但
PROM
将不匹配,因为
O
不在“允许”字符集中

正则表达式是否可以这样做?

使用Java 8,您可以使用表示一个或多个特殊字符的字符组来连接术语中的单个字符,例如类似于
[^-]*
,但使用正则表达式特殊字符转义

String term = "PRM";
String special = "^-";

String delimiter = "[" + Pattern.quote(special) + "]*";
String regex = String.join(delimiter, term.split(""));

System.out.println(Pattern.matches(regex, "PROM"));      // --> false
System.out.println(Pattern.matches(regex, "P^^R---^M")); // --> true
或者,您也可以使用“
标记特殊字符并检查是否相等:

System.out.println(term.equals("PROM".replaceAll(delimiter, "")));      // --> false
System.out.println(term.equals("P^^R---^M".replaceAll(delimiter, ""))); // --> true

如果问题需要的话,我很乐意重新措辞。这是可能的,但很笨拙。您必须执行类似于
P[^-]*R[^-]*M
的操作。更好的解决方案是在应用正则表达式之前从字符串中删除这些字符。我可能可以这样做,但我需要保留字符串,正则表达式会让我的生活更轻松,但如果不合适,我可以继续。然后我建议在删除特殊字符之前复制字符串,然后应用regexso无法全局列出它,我想这是有道理的。谢谢你的帮助。我的意思是不要在每个角色之间插入“特价”列表,而是一次性以全局方式提供。我想这其实并不重要。@kgrad看到了我的第二种方法,只是将所有这些字符替换为零,然后进行比较。事实上,这可能更简单。第二种方法肯定有效,但在我的场景中,我需要保留原始术语。@kgrad这应该不是问题
replaceAll
不修改原始字符串,而是创建一个新字符串。字符串是不可修改的。