我正在使用第三方应用,它使用java的正则表达式捕获匹配。遗憾的是,在运行正则表达式搜索之前,我无法实现任何会在html文档的开头添加内容的java代码,因为在应用程序中不允许这样做。它有很多值得使用的功能而不是传统的方式,否则我会这样做。
此HTML文档实际上只包含<br>
个标记,但每个句子后面总是有空格,而不管用于指定新段落的<br>
标记。
我是因为html标签开始的,之前我注意到它没有捕获第一个单词:
[\s](.*?)[.!?]\s
我用一个单词边界尝试了它之后没有用,但后来它开始抓住'br&gt;'每场比赛:
[\b](.*?)[.!?]\s
通过这种方式,它可以捕获从空白区域或单词边界到完成句子后跟空格的标点符号的所有内容。
这适用于整个文档中的每个其他句子,除了它在所有不同文档上每次都删除文档的第一个单词。可能因为在第一个单词之前没有任何内容存在?
以下是一开始的一些示例文字:
The troll who who lived under the bridge was quite sad. He couldn't help from
trolling without making others mad. He had no friends because of this, but he
could never stop. It made his constantly feel alone. No other soul would comfort
him. <br>
这总是会返回如下句子:
troll who who lived under the bridge was quite sad
He couldn't help from trolling without making others mad
He had no friends because of this, but he could never stop
etc...
正如你所看到的,它错过了第一句中的第一句。
它总是从第一个单词中删除,因为它之前没有任何内容(至少这是我所假设的)。
如何让它发挥作用?
答案 0 :(得分:0)
这是我在PHP中测试的一个解决方案(但它不应该使用Java中没有的正则表达式功能)。
/\b([^<>]*?)[.!?]\s/
由于您说字符串中包含的唯一HTML标记是<br>
,因此您可以简单地说句子只能包含既不是<
也不是>
的字符。为此,我只是将.*?
替换为[^<>]*?
(这是一个否定的字符类)。
答案 1 :(得分:0)
您要在每个单词([\b\s] ...
)之前指定要求字边界的正则表达式。因此,对于任何不以字边界开头的文本,正则表达式将与第一个单词不匹配
请尝试使用"\\s+|\\w+|\\p{Punct}+"
,它会为空白组(1),字母组和/或数字组(2)以及标点符号组(3)分别提供匹配。
使用以下代码进行测试:
Pattern p = Pattern.compile("\\s+|\\w+|\\p{Punct}+");
Matcher m = p.matcher("Hello world! How are you?");
int i=0;
while(m.find()){
System.out.printf("[%02d] - %s",i,m.group());
i++;
}
返回:
[00] - Hello
[01] -
[02] - world
[03] - !
[04] -
[05] - How
[06] -
[07] - are
[08] -
[09] - you
[10] - ?
<强>更新强>
从文本中提取句子很困难,因为单词(较低级别)使用一些相同的边界。
根据您的特定句子,您可以创建一个成功的基于正则表达式的解决方案,但如果不使用Java,C或其他“控制台”语言,您可能无法处理所有可能的句子格式。< / p>
例如,您当前的代码不会处理以:
,;
或%
结尾的句子;但是可以使用正则表达式来实现解决方案。
但有些情况下单靠正则表达式无法处理;尤其是像"\"I'll quit being a troll!\" - The troll said."
这样的组合句子。