Java 请帮助我获取此返回值
我知道使用正则表达式不是在Java中搜索HTML标记的最佳方法。但这是我正在进行的项目的第一步,我还必须搜索非HTML内容。那么为什么下面的代码不起作用呢Java 请帮助我获取此返回值,java,html,regex,Java,Html,Regex,我知道使用正则表达式不是在Java中搜索HTML标记的最佳方法。但这是我正在进行的项目的第一步,我还必须搜索非HTML内容。那么为什么下面的代码不起作用呢 public static String tagValue(String inHTML, String tag) throws DataNotFoundException { String value = null; String searchFor = "/<" + tag + ">(.*?)<\\/"
public static String tagValue(String inHTML, String tag) throws DataNotFoundException
{
String value = null;
String searchFor = "/<" + tag + ">(.*?)<\\/" + tag + "\\>/";
Pattern pattern = Pattern.compile(searchFor);
Matcher matcher = pattern.matcher(inHTML);
return matcher.toString();
}
publicstaticstringtagvalue(stringinhtml,stringtag)抛出DataNotFoundException
{
字符串值=null;
字符串searchFor=“/(.*?/”;
Pattern=Pattern.compile(searchFor);
Matcher-Matcher=pattern.Matcher(inHTML);
返回matcher.toString();
}
我建议您首先在fex样本上尝试正则表达式,例如使用
一旦找到一个好的regexp,就可以在代码中引入它
例如,以下正则表达式(已测试)
正则表达式
原始表达式]*)>(*))
作为Java字符串“]*)>(.*)”
提供以下测试结果:
Target String group(0) group(1) group(2) group(3)
<b>text</b> <b>text</b> b text
<a href="pouet">link</a> <a href="pouet">link</a> a href="pouet" link
<footnote></footnote> <footnote></footnote> footnote
目标字符串组(0)组(1)组(2)组(3)
文本文本b文本
a href=“pouet”链接
脚注
这似乎很好,不是吗?我建议您首先在fex样本上尝试正则表达式,例如使用 一旦找到一个好的regexp,就可以在代码中引入它 例如,以下正则表达式(已测试)
正则表达式
原始表达式]*)>(*))
作为Java字符串“]*)>(.*)”
提供以下测试结果:
Target String group(0) group(1) group(2) group(3)
<b>text</b> <b>text</b> b text
<a href="pouet">link</a> <a href="pouet">link</a> a href="pouet" link
<footnote></footnote> <footnote></footnote> footnote
目标字符串组(0)组(1)组(2)组(3)
文本文本b文本
a href=“pouet”链接
脚注
这似乎很好,不是吗?matcher.toString()不会搜索。使用matcher.find()
或matcher.matches()
下面是如何使用模式
和匹配器
的官方示例
匹配器。toString()
不进行搜索。使用matcher.find()
或matcher.matches()
下面是如何使用模式
和匹配器
的官方示例
如果你在进行这种简单的搜索,却无法找出自己的正则表达式,那么你就违反了KISS原则。请尝试以下方法:
public static String tagValue(String inHTML, String tag) throws DataNotFoundException {
int start = inHTML.first("<"+tag+">");
if(start < 0) throw DataNotFoundException("Couldn't find beginning "+tag+" tag.");
int end = inHtml.first("</"+tag+">", start);
if(end < 0) throw DataNotFoundException("Couldn't find ending "+tag+" tag.");
return intHTML.substring(start,end);
}
publicstaticstringtagvalue(stringinhtml,stringtag)抛出DataNotFoundException{
int start=inHTML.first(“”);
如果(开始<0)抛出DataNotFoundException(“找不到开始“+标记+”标记”);
int end=inHtml.first(“,start”);
如果(end<0)抛出DataNotFoundException(“找不到结尾”+tag+“tag”);
返回intHTML.substring(开始、结束);
}
注意:我还没有运行这个,所以可能存在打字错误。请随意更正它们(并删除此注释)。如果您正在进行这种简单的搜索,但无法找出自己的正则表达式,那么您违反了KISS原则。请尝试以下方法:
public static String tagValue(String inHTML, String tag) throws DataNotFoundException {
int start = inHTML.first("<"+tag+">");
if(start < 0) throw DataNotFoundException("Couldn't find beginning "+tag+" tag.");
int end = inHtml.first("</"+tag+">", start);
if(end < 0) throw DataNotFoundException("Couldn't find ending "+tag+" tag.");
return intHTML.substring(start,end);
}
publicstaticstringtagvalue(stringinhtml,stringtag)抛出DataNotFoundException{
int start=inHTML.first(“”);
如果(开始<0)抛出DataNotFoundException(“找不到开始“+标记+”标记”);
int end=inHtml.first(“,start”);
如果(end<0)抛出DataNotFoundException(“找不到结尾”+tag+“tag”);
返回intHTML.substring(开始、结束);
}
注意:我还没有运行这个,所以可能存在打字错误。请随意更正(并删除此注释)。您似乎在使用一个来自PHP背景的正则表达式-如果您想让正则表达式在Java中工作,需要删除它周围的分隔符(斜杠):
String searchFor = "<" + tag + ">(.*?)</" + tag + ">";
String searchFor=“(.*)”;
否则,您的正则表达式将在您的标记周围寻找可能不存在的文本斜杠。您似乎在使用一个来自PHP背景的正则表达式-如果您想让正则表达式在Java中工作,需要删除它周围的分隔符(斜杠):
String searchFor = "<" + tag + ">(.*?)</" + tag + ">";
String searchFor=“(.*)”;
否则,您的正则表达式将在您的标记周围寻找可能不存在的文字斜杠。您是否可以添加一些关于“如何”不起作用的详细信息?任何堆栈跟踪,或者只是没有结果,或者其他什么?您可以使用XQuery或XPath将文本节点(我想,这就是您所说的“非HTML内容”)与模式匹配。XQuery 1.0和XPath 2.0都支持正则表达式。也不需要将HTML与正则表达式匹配。您是否可以添加一些关于“如何”不工作的详细信息?任何堆栈跟踪,或者只是没有结果,或者其他什么?您可以使用XQuery或XPath将文本节点(我想,这就是您所说的“非HTML内容”)与模式匹配。XQuery 1.0和XPath 2.0都支持正则表达式。也不需要将HTML与正则表达式匹配。我不认为他们的模式会在像
..
这样的文本上做他们希望它做的事情,因为它是第一个
,然后是第一个
,而不是对应的一个。在Java过于简单的正则表达式语言中,您无法正确地执行递归模式,但您可以排除括号。我认为他们的模式不会在像这样的文本上执行他们希望它执行的操作。
,因为它是第一个
,然后是第一个
,而不是对应的一个。在Java过于简单的正则表达式语言中,不能正确地执行递归模式,但可以排除括号。