2017-02-21 278 views
1

我有代码:正则表达式的正则表达式的Java字符串

private static final Pattern TAG_REGEX = Pattern.compile("<p>(.+?)</p>"); 
private static List<String> getTagValues(final String str) { 
    final List<String> tagValues = new ArrayList<String>(); 
    final Matcher matcher = TAG_REGEX.matcher(str); 
    while (matcher.find()) { 
     tagValues.add(matcher.group(1)); 
    } 
    return tagValues; 
} 
      System.out.println(Arrays.toString(getTagValues(stringText).toArray())); 

,我想从这个获得:

"<html><head></head><body><p>Aa , aa.</p><p><b>Aa aa, aa.</b></p><p>Aa aa aa, aa.</p><p><i>Aa, aa.</i></p><p><b><i>B, b, b.</i></b></p><b>Aa aa, aa.</b></body></html>" 

我想只有文本beetwen <p></p>

i want get only this: 

"Aa aa Aa aa aa Aa aa aa aa Aa aa B b b" 

但我不知道我要写什么Pattern.compile("");有人帮忙?

+0

这个'AA AA,AA。'可以在'

'和'

' –

+0

'Jsoup'也可以选择所有的'p'标签数据,但是再次发布的将是'Aa aa,aa。'因为不在'p'里面,并且在'p' –

回答

0

你不需要模式匹配器也不为,你可以做一个替换字符串代替:

str.replaceAll(".*?(<p>.*</p>).*", " $1 ").replaceAll(".*?<p>(.*?)</p>.*?", " $1 ").replaceAll("<[/a-z]+>", " ").replaceAll("[,.]", " ").replaceAll(" +", " ")

它看起来并不漂亮,但是它干得不错:)

+0

谢谢它是有帮助的,但我添加了一些编辑我的文章,因为outpus错了,我不需要Aa aa,aa。在我的输出,所以你知道我必须编辑你的代码,它会工作? – JavaCoder

+0

我已经更新了我的答案,以便与您对答案的修改保持一致。如果它适合你,请投票给我的答案。谢谢。 – artemisian

+0

“\ $ 1”这给我一个错误在eclipse中,'无效的转义序列(有效的是\ b \ t \ n \ f \ r \“\'\\)'这是错误 – JavaCoder

2

我建议使用JSOUP解析器HTML代码

1)将给您的数据Document使用Jsoup.parse(string)函数来提取数据。

2.)获取body标签的数据为Element

3.)使用element.text()获取Element标签的文本。

4.)或者,您可以使用replaceAll("\\s*[,.]\\s*","")删除所有命令和点以及格式空间。

String stringText = "<html><head></head><body><p>Aa , aa.</p><p><b>Aa aa, aa.</b></p><p>Aa aa aa, aa.</p><p><i>Aa, aa.</i></p><p><b><i>B, b, b.</i></b></p><b>Aa aa, aa.</b></body></html>"; 
    Document document =Jsoup.parse(stringText); 
    Element element=document.body(); 
    String plain_String = element.text().replaceAll("\\s*[,.]\\s*"," "); 
    System.out.println(element.text()); // Actual text 
    System.out.println(plain_String); // Formatted text 

输出:

Aa , aa. Aa aa, aa. Aa aa aa, aa. Aa, aa. B, b, b.Aa aa, aa. 
Aa aa Aa aa aa Aa aa aa aa Aa aa B b b Aa aa aa 

Download Jsoup并将其添加作为依赖

\\s*[,.]\\s*\\s*匹配的零个或多个空格

[,.]:匹配内部[]提到的任何字符意味着,.


如果你坚持的regex溶液,然后用

1)首先删除所有不必要的字符,如,.和空格与replaceAll("\\s*[.,]\\s*", " ")

2)使用正则表达式<p[<>ib]*>([\\w\\s]+)<\\/[\\w]>PatternMatcher找到你的文字标签之间

3。)追加找到的文本中StringBuilder并显示结果

代码

String str = "<html><head></head><body><p>Aa , aa.</p><p><b>Aa aa, aa.</b></p><p>Aa aa aa, aa.</p><p><i>Aa, aa.</i></p><p><b><i>B, b, b.</i></b></p><b>Aa aa, aa.</b></body></html>"; 
    Pattern pattern = Pattern.compile("<p[<>ib]*>([\\w\\s]+)<\\/[\\w]>"); 
    Matcher matcher = pattern.matcher(str.replaceAll("\\s*[.,]\\s*", " ")); 
    StringBuilder builder = new StringBuilder(); 
    while (matcher.find()) { 
     builder.append(matcher.group(1)); 
    } 
    System.out.println(builder); 

输出:

Aa aa Aa aa aa Aa aa aa aa Aa aa B b b 
+0

里面有'b'标记,以防万一,如果你想要所有'p'标签数据,使用'document.getElementsByTag(“p”)。text )'但是结果字符串不会包含'Aa aa,aa。'文本数据,因为它不在'p'标签里 –

+0

是的我编辑我的文章,我想这个文本没有Aa aa,aa。但我可以;使用这个Jsuop,因为我必须发送只有文件在java中没有jsoup – JavaCoder

0

你可以试试这个:

String str = "<html><head></head><body><p>Aa , aa.</p><p><b>Aa aa, aa.</b></p><p>Aa aa aa, aa.</p><p><i>Aa, aa.</i></p><p><b><i>B, b, b.</i></b></p><b>Aa aa, aa.</b></body></html>"; 
String start = ">", end = "<"; 
String regexString = Pattern.quote(start) + "(.*?)" + Pattern.quote(end); 
Pattern pattern = Pattern.compile(regexString); 
Matcher matcher = pattern.matcher(str.replaceAll("[.,]", "")); 
while (matcher.find()) { 
    if (!matcher.group(1).replaceAll("\\s{2,}", " ").trim().equals("")) { 
     System.out.print(matcher.group(1).replaceAll("\\s{2,}", " ") + " "); 
    } 
} 

这给了你:

Aa aa Aa aa aa Aa aa aa aa Aa aa B b b Aa aa aa 
+0

感谢它是有帮助的,但我添加了一些编辑我的帖子,因为outpus错了,我不需要Aa aa, aa。在我的输出中,所以你知道我必须编辑你的代码 将工作? – JavaCoder