正则表达式找到持续时间

时间:2017-06-30 08:19:23

标签: java regex

我已经阅读了很多关于stackoverflow的正则表达式问题,但是它们并没有帮助我开发自己的代码。

我需要的是以下内容。我正在解析已经使用Stanford Tagger解析的文本。现在,我试图删除文本某些部分的持续时间:1)当持续时间遵循以下格式时,短语以日期(例如1999_CARD Tom_NN was_VP)2)开头:2/1999_CARD -_- 01/01/2000_CARD(或类似的)。

我开发了一个代码。但它错误地删除了其他一些部分。我不知道为什么。我的正则表达式如下

    String regex = "(\\s|\\b.*?_(CARD|CD)\\s([^A-Za-z0-9])+_([^A-Za-z0-9])+(.*?)+_(CARD|CD))|(\\b.*?_(CARD|CD))";
        Pattern pattern2 = Pattern.compile(regex);
        Matcher m2 = pattern2.matcher(chunkPhrase);
        if (m2.find()) {

            chunkPhrase = chunkPhrase.replace(m2.group(0), "");
        }

例如,在下面的短语中,它找到了一些东西(但它不应该是

·_NNP Research_NNP of_IN Symbian_NNP OS_NNP 7.0_CD s_NNS

在删除上述短语中的持续时间后,我离开了· s_NNS这不是我想要的。

为了更清楚地表达我对代码的期望,这里有一些例子:

1/1/2002_CD -_- 1/2/2003_CD Test_NN Company_NN

应用代码后,我希望:

Test_NN Company_NN

对于这个:

1/1/2002_CARD -_- 1/2/2003_CARD Test_NN Company_NN

应用代码后,我希望:

Test_NN Company_NN

对于这个:

2000_CARD I_NN was_VP working_NP here_ADV

应用代码后,我希望:

I_NN was_VP working_NP here_ADV

对于这个:

I_NN have_VP worked_VP in_PP 3_CARD companies_NP

应用代码后,我希望:

I_NN have_VP worked_VP in_PP 3_CARD companies_NP

同时,我使用java

更新:为了更好地澄清:如果在开始时出现一个号码,则必须将其删除。否则,必须保留。如果它遵循第二种格式(例如1999_CD -_- 2000_CARD),则必须将其删除,如果它出现在短语的开头或中间或末尾则无关紧要。

任何人都可以帮助我的代码出错吗?

2 个答案:

答案 0 :(得分:1)

根据您提供的示例,以下正则表达式将捕获所需的持续时间

((?:\d{2,}|\d{1,2}\/\d{1,2}\/\d{2,4})_(?:CARD|CD) (?:-_- )?)

<强>详情

(?:\d{2,}|\d{1,2}\/\d{1,2}\/\d{2,4})  // match minimum of 2 digits or a date in xx/xx/xx[xx] format

_(?:CARD|CD)  // match _CARD or _CD

(?:-_- )?  // match -_- , if it exists 

开头的?:表示这些是非捕获组。围绕整个事物的括号是捕获组

See demo here

答案 1 :(得分:1)

您可以使用此正则表达式:

final String regex = "\\b(?:\\d{1,2}/*\\d{1,2}/)?\\d{4}_(?:CARD|CD)(?:\\h*[-_]+)?\\h*";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(input);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll("");

System.out.println("Substitution result: " + result);

RegEx Demo

RegEx分手:

  • \b - 字边界
  • (?: - 启动非捕获组
    • \d{1,2}/*\d{1,2}/ - 匹配日期的mm / dd部分
  • )? - 结束非捕获组(可选
  • \d{4} - 匹配年份的4位数字
  • _ - 匹配文字_
  • (?:CARD|CD) - 匹配CARDCD
  • (?: - 启动非捕获组
    • \h*[-_]+ - 匹配水平空格,后跟1个或多个-_
  • )? - 结束非捕获组(可选
  • \h* - 匹配0个或更多水平空格