^((?!PATTERN).)*$
如果给出上面的字符串,则输出应为PATTERN。
每个输入的特殊字符都相同,用户只能更改这些特殊字符内的字词。
当我进行分割时,我会在索引6 Exception附近获得一个未闭合组。
String test = "^((?!PATT).)*$";
String patternOne = "^((?!";
String patternTwo = ").)*$";
if(test.contains(patternOne) && test.contains(patternTwo))
{
test = test.split(patternOne)[1];
test = test.split(patternTwo)[0];
}
答案 0 :(得分:2)
String上的split()
方法采用RegEx。您传递的是无效的RegEx。您最好使用substring()
函数,因为您已经知道前缀和后缀模式。
test = test.substring(patternOne.length(), test.length() - patternTwo.length());
答案 1 :(得分:1)
这不应该是更简单的方法吗?因为你要覆盖你的测试变量,你可以只用你的模式替换你的模式。你根本不需要检查测试是否包含它们
String test = "^((?!PATT).)*$";
String patternOne = "^((?!";
String patternTwo = ").)*$";
test = test.replace(patternOne, "").replace(patternTwo,"");
答案 2 :(得分:0)
请更改代码:
String test = "^((?!PATT).)*$";
String patternOne = "^((?!";
String patternTwo = ").)*$";
if(test.contains(patternOne) && test.contains(patternTwo))
{
test = test.split(patternOne)[1];
test = test.split(patternTwo)[0];
}
这样更容易:
String test ="^((?!PATTERN).)*$";
String result = test.replaceAll("[^\\w\\s]","");
答案 3 :(得分:0)
您收到错误的原因是split
方法将其参数理解为 regex ,并且前缀和后缀中的所有字符实际上都是正则表达式中的特殊字符。
有一些方法可以转义特殊字符,但在这种情况下,实际上不需要使用基于正则表达式的split
方法来满足此特定要求。它实际上不是正确的工具。只需使用substring
从模式中提取单词,因为您确切知道它的起始位置和结束位置:
class Test {
public static final String PREFIX = "^((?!";
public static final int PREFIX_LEN = PREFIX.length();
public static final String SUFFIX = ").)*$";
public static final int SUFFIX_LEN = SUFFIX.length();
public static String extractWord( String arg ) {
if (arg.startsWith(PREFIX) && arg.endsWith(SUFFIX)) {
return arg.substring(PREFIX_LEN, arg.length() - SUFFIX_LEN);
}
return null;
}
public static void main( String[] args ) {
System.out.println( extractWord("^((?!PATT).)*$") );
}
}
这告诉它提取在PREFIX结束后开始的字符串部分,并在SUFFIX的开头结束。
答案 4 :(得分:-1)
你可以通过多次分割字符串来实现它
String test = "^((?!PATT).)*$";
String patternOne = "^((?!";
String patternTwo = ").)*$";
if(test.contains(patternOne) && test.contains(patternTwo))
{
test = test.split(patternOne)[1].split(patternTwo)[0];
}
让我知道这是否有效?