用于html选择标记解析的Java正则表达式

用于html选择标记解析的Java正则表达式,java,regex,Java,Regex,我将编写一个程序,其中我只是逐行读取jsp文件,并使用正则表达式检查页面中是否有select标记。如果是,那么我想提取data标记之间的数据 我写了下面的正则表达式 (?:\n?\s+(.*$.*)\n?\s+.* 对于不了解regex101的人,您还可以使用左上角的侧栏查看regex的java代码 问题是正则表达式与字符串的任何内容都不匹配: <select name="javaType"> <option value="boolean">boolean</

我将编写一个程序,其中我只是逐行读取jsp文件,并使用正则表达式检查页面中是否有
select
标记。如果是,那么我想提取
data
标记之间的数据

我写了下面的正则表达式

(?:\n?\s+(.*$.*)\n?\s+.*
对于不了解regex101的人,您还可以使用左上角的侧栏查看regex的java代码

问题是正则表达式与字符串的任何内容都不匹配:

<select name="javaType">
  <option value="boolean">boolean</option> 
  <option value="byte">byte</option> 
  <option value="char" selected>char</option> 
  <option value="double">double</option> 
  <option value="float">float</option> 
  <option value="int">int</option> 
  <option value="long">long</option> 
</select>

布尔值
字节
烧焦
双重的
浮动
int
长的
我想提取标签之间的数据。我知道我的正则表达式是不完整的,但我不知道我应该如何进行这项工作


我是否逐行分析并首先检查select标记,然后再次检查标记?或者有更好的方法使用正则表达式吗?

为什么不使用一些html解析器来处理它呢? 你的问题不是很具体

我想您可能想检查选择了哪个选项。 根据我的理解,我给出了一个简单的正则表达式

selected\>(?<selected>(\w+))<
selected\>(?(\w+)<

所选
的命名模式是所选的模式。

您正在正则表达式中使用
look aheads(?:)
查找模式。要使其正常工作,所有内容都必须在一行中。如果您想为
bash
找到正则表达式,那么我们可以使用
tr-s'\n'
在一行中转换字符串,然后向前看可能会有所帮助


我们也可以在java中执行类似的操作,但我建议您逐个循环文件行,搜索
,下面是一个匹配的正则表达式:

/(?:<select.*?>.*?((<option.*?<\/option>\s*)+)<\/select>.*)/ims

/(?:.*)((要解析html,您可以使用我不能,因为某些原因,我只能选择使用正则表达式。“我不能,因为某些原因”,这是什么原因?您在使用它时遇到了一些问题(错误/异常/不正确的结果),还是其他人(可能没有看到,或者)?您能否向我们展示您使用解析器的尝试(也许您遗漏了一些错误,我们会发现)?这是因为我们的客户坚持只为此使用regex,我不知道他的问题是什么,但根据我的经验,这是传达给我的,大量的否决票通常是因为相信人们不应该支持为工作选择不正确的工具(就像在swing中使用
null
作为布局管理器).HTML不是正则语言,因此不应使用正则表达式处理它(请参阅我前面的链接)。这里合适的工具应该是HTML解析器。您使用错误的工具越多,当您面临需要使用正确工具的情况时,问题就越大(几乎肯定会发生这种情况)“唯一不变的是变化”)。那么为什么不在一开始就使用合适的工具呢?出于某些原因,我不可能使用html解析器,我只有使用正则表达式或在我的项目中不需要任何额外JAR的东西的选择。为什么投反对票?
public static void main(String[] args) throws IOException {
    String strTest = "D:\\Temp.jsp";
    File file = new File(strTest);
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String strLine = "";
    boolean selectStartFound = false;
    Pattern pattern = Pattern.compile("<option .*?>(.+?)</option>");
    Matcher matcher = null;
    while ((strLine = reader.readLine()) != null) {
        if (!selectStartFound && strLine.toLowerCase().contains("<select")) {
            selectStartFound = true;
        }
        if (selectStartFound) {
            matcher = pattern.matcher(strLine);
            if (matcher.find()) {
                System.out.println(matcher.group(1));
            }
        }
        if (selectStartFound && strLine.toLowerCase().contains("</select>")) {
            selectStartFound = false;
        }
    }
    reader.close();
}
/(?:<select.*?>.*?((<option.*?<\/option>\s*)+)<\/select>.*)/ims