边缘效果(有害效果)正则表达式删除编号

时间:2019-06-26 09:48:41

标签: java regex

我正在尝试从某些文本中删除编号(罗马编号和基本编号),我使用以下 Regex ,它很容易泛化,并且似乎与大多数模式匹配编号,尽管我发现此正则表达式有一些副作用(有害作用)。

我当前正在匹配各种编号模式:

i/ iv. I) II) 27 a) 3. b) 145) b) (ii) (9) a-

public class RemoveNumbering
{


  private static final Pattern ROMAN = Pattern.compile(
      "^[(\\\\]?\\s*(?=[DCLXVI])M*(CM|D?C{0,3}|CD)(XC|L?X{0,3}|XL)(IX|V?I{0,3}|IV)[\\-.)/]\\s|^[(\\\\\\\\]?\\\\s*[0-9]+(?:\\\\-|\\)|\\|\\/|\\s*)[-)\\\\/]\\s|^[\\\\(\\\\]?\\s*[0-9]+\\s*(?:\\-|\\)|\\.|\\|\\/|\\s*)\\s*[a-zA-Z]{1}[-\\\\.)\\\\/]\\s+|^[(\\\\]?\\s*[a-zA-Z]{1}[-)\\\\/]\\s+",
      Pattern.CASE_INSENSITIVE);

  private static final Pattern BASIC = Pattern.compile("^[(\\\\]?\\s*[0-9]{1,2}(?:\\-|\\)|\\|\\/|\\s*)[-)\\/]\\s",
      Pattern.CASE_INSENSITIVE);

public String replace(String text)
  {
    Matcher romanMatch = ROMAN.matcher(text);
    while (romanMatch.find())

    {
      text = romanMatch.replaceAll("").replaceAll(" +", " ").trim();
    }
    Matcher singleNumberMatch = BASIC.matcher(text);
    while (singleNumberMatch.find())

    {
      text = singleNumberMatch.replaceAll("").replaceAll(" +", " ").trim();
    }

    return text;
}

以下示例应保持不变(不删除“ 7-”或“ 66 B.”):
7-10décembre:戈尔巴乔夫-埃塞茨-环球大学总理参观。
公元前66年:它是庞培占领的,属于叙利亚省。

0 个答案:

没有答案