我有一个解析树,其中包含一些信息.为了提取我需要的信息,我使用的代码根据正斜杠(/)拆分字符串,但这不是一个完美的代码.我在这里解释更多细节:
我之前在另一个项目中使用过此代码并且运行良好.但是现在我的新数据集的解析树更复杂,代码有时会做出错误的决定.
解析树是这样的:
(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. ) ) ) ) )
Run Code Online (Sandbox Code Playgroud)
如您所见,树的叶子是正斜杠之前的词.为了得到这些话,我之前使用过这段代码:
parse_tree.split("/");
Run Code Online (Sandbox Code Playgroud)
但现在,在我的新数据中,我看到这样的实例:
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).
您应该能够通过正则表达式使用负向后查找。这需要更大的输入样本才能确定,但似乎适用于您的两种情况:
String pattern = "(?<![\\:\\/])\\/";
String s1 = "(TOP Source/NN http://www.alwatan.com.sa/daily/2007-01-31/first_page/first_page01.htm/X ./. )";
List<String> a = (List<String>) Arrays.asList(s1.split(pattern));
System.out.println("first case:");
System.out.println(a.stream().map(i->i.toString()).collect(Collectors.joining(",\n")));
System.out.println("\n");
String s2 = "(NPB~sister~2~2 Your/PRP$ sister/NN //PUNC: )";
a = (List<String>) Arrays.asList(s2.split(pattern));
System.out.println("second case");
System.out.println(a.stream().map(i->i.toString()).collect(Collectors.joining(",\n")));
Run Code Online (Sandbox Code Playgroud)
这输出:
first case:
(TOP Source,
NN http://www.alwatan.com.sa,
daily,
2007-01-31,
first_page,
first_page01.htm,
X .,
. )
second case
(NPB~sister~2~2 Your,
PRP$ sister,
NN ,
/PUNC: )
Run Code Online (Sandbox Code Playgroud)