3

我正在使用一个 3rd 方应用程序,它使用 java 的正则表达式来捕获匹配项。遗憾的是,在运行正则表达式搜索之前,我无法实现任何会在 html 文档开头添加内容的 java 代码,因为应用程序中不允许这样做。它有很多值得使用的功能,而不是传统的方式,否则我会那样做。

这个 HTML 文档实际上只有<br>标签,但无论<br>用于指定新段落的标签如何,每个句子后总是有一个空格。

由于 html 标签,我开始使用它,在我注意到它没有捕获第一个单词之前:

[\s](.*?)[.!?]\s

之后我尝试了一个单词边界,但没有成功,但随后它开始在每场比赛中抓取“br>”:

[\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...

如您所见,第一句话中缺少第一个。

它总是放弃第一个单词,因为它之前不存在任何东西(至少这是我假设的)。

我怎样才能让它工作?

4

2 回答 2

0

这是我在 PHP 中测试的一种解决方案(但它不应该使用 Java 中不可用的正则表达式功能)。

/\b([^<>]*?)[.!?]\s/

由于您说字符串中包含的唯一 HTML 标记是<br>您可以简单地说句子只能包含既不是<也不是的字符>。为此,我简单地替换.*?[^<>]*?(这是一个否定字符类)。

于 2012-10-08T17:07:08.250 回答
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 或其他“控制台”语言,您可能无法处理所有可能的句子格式。

例如,您当前的代码不会处理以:,;%;结尾的句子。但是可以使用正则表达式来实现解决方案。

但是有些情况仅靠正则表达式无法处理;特别是像"\"I'll quit being a troll!\" - The troll said.".

于 2012-10-08T17:29:23.497 回答