如何使正则表达式允许可选的前缀和后缀提取

时间:2017-09-14 04:58:32

标签: java regex

如标题所述,正则表达式应该用于通过给定字符串,字符串的前缀(可选)和字符串的后缀(可选)提取信息的目的

那样

当前缀为'前缀_'时,

prefix_group_1_suffix会返回group_1和后缀是_suffix

当前缀为'前缀_'时,

prefix_group_1会返回group_1和后缀是null< - 我的代码无法处理这种情况

当前缀为' null'时,

group_1_suffix会返回group_1和后缀是_suffix

当前缀为' null'时,

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 ''

但是上面的代码适用于其他两个条件

2 个答案:

答案 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猜测在字符串中查找子字符串将是更好的选择。

每个地方都有

代码....