如标题所述,正则表达式应该用于通过给定字符串,字符串的前缀(可选)和字符串的后缀(可选)提取信息的目的
那样
当前缀为'前缀_'时, prefix_group_1_suffix
会返回group_1
和后缀是_suffix
prefix_group_1
会返回group_1
和后缀是null
< - 我的代码无法处理这种情况
group_1_suffix
会返回group_1
和后缀是_suffix
group_1
会返回group_1
和后缀是null
< - 我的代码无法处理这种情况
这是我的代码,但我发现它
时无效 String itemName = "";
String prefix = "TEST_";
String suffix = "";
String itemString = prefix + "item_1" + suffix;
String prefix_quote = "".equals(prefix) ? "" : Pattern.quote(prefix);
String suffix_quote = "".equals(suffix) ? "" : Pattern.quote(suffix);
String regex = prefix_quote + "(.*?)" + suffix_quote;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(itemString);
while (matcher.find()) {
itemName = matcher.item(1);
break;
}
System.out.println("itemString '"+itemString+"'");
System.out.println("Prefix quote '"+prefix_quote+"'");
System.out.println("Suffix quote '"+suffix_quote+"'");
System.out.println("regex '"+regex+"'");
System.out.println("itemName is '"+itemName+"'");
这是输出
itemString 'TEST_item_1'
Prefix quote '\QTEST_\E'
Suffix quote ''
regex '\QTEST_\E(.*?)'
itemName is ''
但是上面的代码适用于其他两个条件
答案 0 :(得分:0)
您的代码失败的原因在于惰性量词.*?
。它的优先级是尽可能少地匹配,最好是空字符串,所以就是这样。因此,您需要将正则表达式锚定到字符串的开头/结尾以及可能的前缀/后缀。
为此,您可以使用lookaround assertions:
String prefix = "TEST_";
String suffix = "";
String itemString = prefix + "item_1" + suffix;
String prefix_quote = "".equals(prefix) ? "^" : Pattern.quote(prefix);
String suffix_quote = "".equals(suffix) ? "$" : Pattern.quote(suffix);
String regex = "(?<=^|" + prefix_quote + ")(.*?)(?=$|" + suffix_quote + ")";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(itemString);
这将导致正则表达式
(?<=^|TEST_)item_1(?=$|$)
<强>解释强>
(?<= # Assert that it's possible to match before the current position
^ # either the start of the string
| # or
TEST_ # the prefix
) # End of lookbehind
item_1 # Match "item_1"
(?=$|$) # Assert that it's possible to match after the current position
# either the end of the string or the suffix (which is replaced
# by the end of the string if empty. Of course that could be optimized
# when constructing the regex, this is just a quick-and-dirty solution).
答案 1 :(得分:-1)
如果您要查找特定字符串,则可以使用任何字符串匹配算法:
1.“boyer moore horspool”算法是一个更好的版本的kmp sring匹配算法。您可以尝试查找要搜索的字符串的位置。 2.你也可以看看“Levenshtein距离”进行模糊字符串匹配。
3.i猜测在字符串中查找子字符串将是更好的选择。
每个地方都有代码....