我已经阅读了很多关于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
),则必须将其删除,如果它出现在短语的开头或中间或末尾则无关紧要。
任何人都可以帮助我的代码出错吗?
答案 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
开头的?:
表示这些是非捕获组。围绕整个事物的括号是捕获组
答案 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分手:
\b
- 字边界(?:
- 启动非捕获组
\d{1,2}/*\d{1,2}/
- 匹配日期的mm / dd部分)?
- 结束非捕获组(可选)\d{4}
- 匹配年份的4位数字_
- 匹配文字_
(?:CARD|CD)
- 匹配CARD
或CD
(?:
- 启动非捕获组
\h*[-_]+
- 匹配水平空格,后跟1个或多个-
或_
)?
- 结束非捕获组(可选)\h*
- 匹配0个或更多水平空格