我有一个字符串,如何检查该字符串是否是正则表达式,或者包含正则表达式,还是普通字符串?
你唯一可靠的检查方式是判断这个 String
是否是一个语法正确的正则表达式:
boolean isRegex;
try {
Pattern.compile(input);
isRegex = true;
} catch (PatternSyntaxException e) {
isRegex = false;
}
需要注意的是,即使对于像Hello World
和I'm not a regex
这样的字符串,由于它们在技术上是有效的正则表达式,因此这将导致结果为true
。
这将返回false
的唯一情况是那些无效的正则表达式字符串,例如[未关闭的字符类
或(未关闭的组
或+
。
String
对象时,它们不存在。因此,要么我有一个表示^\w+$
的String
(可能是通过看起来像这样的String
字面量"^\\w+$"
),要么我会编译错误(通过编写看起来像这样的String
字面量"^\w+$"
)。但是没有“具有错误Java转义字符”的String
对象。这根本不可能。 - Joachim Sauer[^abc]
是一个正则表达式吗?还是它是一个字面字符串,因为我想要搜索这个正则表达式? - Joachim Sauer虽然这不是很美观,但它可以检测简单的正则表达式(需要注意的是,这些正则表达式必须是为Java设计的,即具有相应的反斜杠字符转义)。
public boolean isRegex(final String str) {
try {
java.util.regex.Pattern.compile(str);
return true;
} catch (java.util.regex.PatternSyntaxException e) {
return false;
}
}
普通字符串和正则表达式之间没有区别。 正则表达式只是一个普通字符串,用作模式以匹配另一个字符串中的模式出现。
正如其他人指出的那样,字符串可能不是有效的正则表达式,但我认为这是您可以执行的唯一检查。 如果它有效,则无法知道它是正则表达式还是普通字符串,因为它将是正则表达式。
它只是一个普通字符串,由正则表达式引擎以特定方式解释。
例如,“blah”是一个正则表达式,它只会匹配另一个字符串中出现的“blah”字符串。
从这个角度看,您可以看到正则表达式不需要包含任何进行更高级模式匹配的“特殊字符”,它只会匹配模式中的字符串。
boolean validRE = true;
try {
RE re = new RE(stringToCheck);
} catch (RESyntaxException e) {
validRE = false;
}
显然,用户输入了无效的正则表达式,而您将其处理为普通字符串。
如果有人只想区分普通文本字符串和正则表达式:
static boolean hasSpecialRegexCharacters(String s){
Pattern regexSpecialCharacters = Pattern
.compile("[\\\\\\.\\[\\]\\{\\}\\(\\)\\<\\>\\*\\+\\-\\=\\!\\?
\\^\\$\\|]");
return regexSpecialCharacters.matcher(s).find();
}
/**
* If input string is a regex, matches will always return a false.
*/
public boolean isRegex(final String str) {
return str != null ? !str.matches(str) : false;
}
x
是一个有效的正则表达式,可以匹配其本身,所以你的代码无法正确工作。 - svick
String s = "my string with \[.\] and another [^b].";
那么他/她如何知道该字符串包含正则表达式?我是对的还是我是对的?哈哈 - Buhake Sindi