有没有在Java中的任何方法或转义(未引用)的特殊字符(元字符),为了使用它作为一个正则表达式的任何开源库?
这将是动态构建一个正则表达式非常方便,无需手动逃避每个个性。
例如,考虑一个简单的regex像\d+\.\d+
与一个小数点像匹配数1.2
,以及如以下代码:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
不足为奇的是,由上面的代码所产生的输出是:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
也就是说, regex1
匹配1.2
,但regex2
(这是“动态的”建)不(相反,它的文字字符串匹配d+.d+
)。
那么,有没有会自动跳脱每个正则表达式元字符的方法?
如果有,比方说,一个静态escape()
的方法java.util.regex.Pattern
,输出
Pattern.escape('.')
将字符串"\."
但
Pattern.escape(',')
应该只是生产","
,因为它不是一个元字符。 同样的,
Pattern.escape('d')
可以产生"\d"
,因为'd'
被用来表示数字(尽管逃逸可能无法在此情况下是有意义的,如'd'
可能意味着字面'd'
,其将不会被正则表达式interpeter被误解为别的东西,如将与情况'.'
)。
有没有在Java中的任何方法或转义(未引用)的特殊字符(元字符),为了使用它作为一个正则表达式的任何开源库?
我不是100%肯定这是你问这里。 如果你正在寻找一种方法来创建,你可以在你的正则表达式的使用模式则只是前面加上他们与常量"\\"
应该工作,但没有很好的Pattern.escape('.')
功能,以帮助这一点。
所以,如果你想匹配"\\d"
(字符串\d
不是十进制字符的),那么你会怎么做:
// this will match on \d as opposed to a decimal character
String matchBackslashD = "\\\\d";
// as opposed to
String matchDecimalDigit = "\\d";
4个斜线Java字符串在变成2条斜线在正则表达式模式。 2个反斜杠在正则表达式模式反斜杠本身相匹配。 前面加上反斜线任何特殊字符把它变成一个正常的字符,而不是一个特殊的一个。
matchPeriod = "\\.";
matchPlus = "\\+";
matchParens = "\\(\\)";
...
在您的文章使用Pattern.quote(string)
方法 。 你可能知道,这个包装之间的模式"\\Q"
和"\\E"
这样你就可以匹配,即使它恰好有一个特殊的正则表达式字符在一个字符串( +
, .
, \\d
等)
我写了这个模式:
Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[{}()\\[\\].+*?^$\\\\|]");
并在此方法使用它:
String escapeSpecialRegexChars(String str) {
return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\\\$0");
}
然后你可以这样使用它,例如:
Pattern toSafePattern(String text)
{
return Pattern.compile(".*" + escapeSpecialRegexChars(text) + ".*");
}
我们需要做,因为,后逃逸,我们增加了一些正则表达式的表达式。 如果没有,你可以简单地使用\Q
和\E
:
Pattern toSafePattern(String text)
{
return Pattern.compile(".*\\Q" + text + "\\E.*")
}
正则表达式匹配知道你正在寻找一个数字,不信的唯一途径d
是逃避字母( \d
)。 在Java中键入正则表达式转义字符,你需要逃脱它(这样\
变成\\
)。 因此,有各地的特殊字符的正则表达式输入双反斜线没有办法。
格雷同意,因为您可能需要您的模式有两种litrals(\ [\])和元字符([,])。 所以用一些工具,你应该能够逃脱首先所有的字符,然后你可以添加你想在相同的模式添加元字符。
使用
pattern.compile("\"");
String s= p.toString()+"yourcontent"+p.toString();
将给出结果作为yourcontent
原样
使用这个工具功能escapeQuotes()
为了逃避字符串组和一个套之间RegualrExpression
。
正则表达式字面的列表逃脱<([{\^-=$!|]})?*+.>
public class RegexUtils {
static String escapeChars = "\\.?![]{}()<>*+-=^$|";
public static String escapeQuotes(String str) {
if(str != null && str.length() > 0) {
return str.replaceAll("[\\W]", "\\\\$0"); // \W designates non-word characters
}
return "";
}
}
从模式类反斜杠字符('\')
用于引入转义结构。 字符串常量"\(hello\)"
是非法的,并导致编译时错误; 为了字符串匹配字符串(你好)字面"\\(hello\\)"
必须被使用。
例如 :String要匹配(hello)
,并用一组正则表达式是(\(hello\))
形成在这里你只需要逃避匹配的字符串,如下图所示。 Test Regex online
public static void main(String[] args) {
String matched = "(hello)", regexExpGrup = "(" + escapeQuotes(matched) + ")";
System.out.println("Regex : "+ regexExpGrup); // (\(hello\))
}