java - 用正斜杠分割的正则表达式

标签 java regex

我有一个包含一些信息的解析树。为了提取我需要的信息,我使用了一个基于正斜杠 (/) 拆分字符串的代码,但这不是一个完美的代码。我在这里解释更多细节:

我之前在另一个项目中使用过这段代码,效果很好。但是现在我的新数据集的解析树更加复杂,代码有时会做出错误的决定。

解析树是这样的:

(TOP~did~1~1 (S~did~2~2 (NPB~I~1~1 I/PRP ) (VP~did~3~1 did/VBD not/RB (VP~read~2~1 read/VB (NPB~article~2~2 the/DT article/NN ./PUNC. ) ) ) ) ) 

如您所见,树的叶子就是正斜杠之前的单词。为了得到这些词,我之前使用过这段代码:

parse_tree.split("/");

但是现在,在我的新数据中,我看到了这样的实例:

1) (TOP Source/NN http://www.alwatan.com.sa/daily/2007-01-31/first_page/first_page01.htm/X ./. )

由于网站地址有多个斜杠(在这种情况下,只有最后一个斜杠是单词的分隔符)。

2) (NPB~sister~2~2 Your/PRP$ sister/NN//PUNC: )

斜杠本身就是一个词。

你能帮我用一个可以处理这些情况的表达式替换我当前的简单正则表达式吗?

总而言之,我需要一个可以根据正斜杠拆分的正则表达式,但它必须能够处理两个异常: 1)如果有网站地址,必须根据最后一个斜杠分割。 2) 如果有两个连续的斜杠,则必须根据第二个拆分进行拆分(并且第一个斜杠不能被视为分隔符,它是一个WORD)。

最佳答案

我按照这篇文章实现了您的要求:

http://www.rexegg.com/regex-best-trick.html

总结一下,这是总体策略:

首先,您需要以这种格式创建一个正则表达式:

NotThis | NeitherThis | (IWantThis)

之后,您的捕获组 $1 将仅包含您有兴趣执行拆分的斜杠。

然后你可以用不太可能发生的东西替换它们,然后你在这个替换的术语中执行拆分。

所以,考虑到这个策略,这里是代码:

正则表达式:

\\/(?=\\/)|(?:http:\\/\\/)?www[\\w\\.\\/\\-]*(?=\\/)|(\\/)

解释:

NotThis term 将是带有 lookAhead 的双斜杠(仅采用第一个斜杠)

\\/(?=\\/)

NeitherThis 术语只是一个基本的 url 检查,具有前瞻性,不会捕获最后一个\/

(?:http:\\/\\/)?www[\\w\\.\\/\\-]*(?=\\/)

IWantThis term 就是斜线:

(\\/)

在 Java 代码中,您可以像这样将所有这些放在一起:

Pattern p = Pattern.compile("\\/(?=\\/)|(?:http:\\/\\/)?www[\\w\\.\\/\\-]*(?=\\/)|(\\/)");

Matcher m = p.matcher("(TOP~did~1~1 (S~did~2~2 (NPB~I~1~1 I/PRP ) (VP~did~3~1 did/VBD not/RB (VP~read~2~1 read/VB (NPB~article~2~2 the/DT article/NN ./PUNC. ) ) ) ) )\n(TOP Source/NN http://www.alwatan.com.sa/daily/2007-01-31/first_page/first_page01.htm/X ./. )\n(NPB~sister~2~2 Your/PRP$ sister/NN //PUNC: )");
StringBuffer b= new StringBuffer();
while (m.find()) {
    if(m.group(1) != null) m.appendReplacement(b, "Superman");
    else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
System.out.println("\n" + "*** Replacements ***");
System.out.println(replaced);

String[] splits = replaced.split("Superman");
System.out.println("\n" + "*** Splits ***");
for (String split : splits) System.out.println(split);

输出:

*** Replacements ***                                                                                                                                                                                  
(TOP~did~1~1 (S~did~2~2 (NPB~I~1~1 ISupermanPRP ) (VP~did~3~1 didSupermanVBD notSupermanRB (VP~read~2~1 readSupermanVB (NPB~article~2~2 theSupermanDT articleSupermanNN .SupermanPUNC. ) ) ) ) )      
(TOP SourceSupermanNN http://www.alwatan.com.sa/daily/2007-01-31/first_page/first_page01.htmSupermanX .Superman. )                                                                                    
(NPB~sister~2~2 YourSupermanPRP$ sisterSupermanNN /SupermanPUNC: )                                                                                                                                           

*** Splits ***                                                                                                                                                                                        
(TOP~did~1~1 (S~did~2~2 (NPB~I~1~1 I                                                                                                                                                                  
PRP ) (VP~did~3~1 did                                                                                                                                                                                 
VBD not                                                                                                                                                                                               
RB (VP~read~2~1 read                                                                                                                                                                                  
VB (NPB~article~2~2 the                                                                                                                                                                               
DT article                                                                                                                                                                                            
NN .                                                                                                                                                                                                  
PUNC. ) ) ) ) )                                                                                                                                                                                       
(TOP Source                                                                                                                                                                                           
NN http://www.alwatan.com.sa/daily/2007-01-31/first_page/first_page01.htm                                                                                                                             
X .                                                                                                                                                                                                   
. )
(NPB~sister~2~2 Your                                                                                                                                                                                  
PRP$ sister                                                                                                                                                                                           
NN /
PUNC: ) 

关于java - 用正斜杠分割的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122152/

相关文章:

java - 循环时递减递增

android - 减少本地数据库中的数据库请求

javascript - 移动设备正则表达式,以 09 或 04 开头

java - Runtime.availableProcessors : what is it going to return?

java - 一个月中倒数第二个星期的 Cron 表达式

java - JDK 日志 API

java - 正则表达式在比赛后获得 n 行

java - 计算倾斜航空图像的坐标

AWS 上 Redis 身份验证 token 的正则表达式

Python 正则表达式通过对属于同一类别的元素进行分组