如何使图案有点清晰? [复制]

Posted

技术标签:

【中文标题】如何使图案有点清晰? [复制]【英文标题】:How to make pattern a bit clear? [duplicate] 【发布时间】:2018-04-16 10:02:04 【问题描述】:

我正在尝试使用正则表达式解析 html 页面,但我想要编译的模式看起来像怪物。

public static void main(String[] args)  
        String form = "123123" +
                "<input type=\"hidden\" name=\"ip_h\" value=\"8d25cea553b4afe087\" />\n" +
                "<input type=\"hidden\" name=\"lg_h\" value=\"e04c5b67874fd6e28b\" />\n" +
                "<input type=\"hidden\" name=\"_origin\" value=\"https://oauth.site.com\" />\n"+
                 "<input type=\"hidden\" name=\"to\" value=\"aHR0cHM6Ly9vYXV0aC52ay5jb20vYXl\" />";
        Pattern pattern = Pattern.compile(".*\"ip_h\".value=\"([a-z0-9]*)\".*\\s.*lg_h\".value=\"([a-z0-9]*)\".*\\s.*\\s.*to\".value=\"([a-zA-Z0-9]*)\".*");
        Matcher matcher = pattern.matcher(form);
        matcher.matches();
        System.out.println(matcher.group(1)+matcher.group(2)+matcher.group(3));

    

有没有机会说清楚一点? 为什么当我有“\n”时我应该总是使用\s? (.*) - 是否也匹配所有内容和空格? 另外,如果我想获得更多关于错误的信息,我该怎么办,不仅是:“线程“主”java.lang.IllegalStateException 中的异常:未找到匹配项”

【问题讨论】:

不要使用正则表达式来解析 html。您可以使用jsoup.org 到此。 @JEY 但是只为 html 页面中的 3 个值使用外部库是矫枉过正的,不是吗? 当然,但是如果您想要一个更易读的代码来处理所有可能的情况,这是最好的方法(实现与 jsoup 等效的东西对您来说会很长)。如果您确定 html 是有效的 xml,那么您可以使用 DOM 或 SAX 对其进行解析。 【参考方案1】:

在我看来,我认为您只是为了完成手头的任务而对正则表达式进行了过度思考。让你的表达尽可能简单易读总是一个好主意。很明显你已经意识到了这一点。

这里显然需要分组,因为您只需要与该数据特别相关的名称中的特定数据。由于您已经知道名称,因此您想要从中获取特定数据会使事情变得更容易:

现在我不知道网页内容由什么组成,但我们将介绍几个场景。您的情况很可能是两者中的后者。

场景 1:

如果网页内容中只有特定数量的行,其中包括:

<input type="hidden" name="ip_h" value="8d25cea553b4afe087" />
<input type="hidden" name="lg_h" value="e04c5b67874fd6e28b" />
<input type="hidden" name="_origin" value="https://oauth.site.com" />
<input type="hidden" name="to" value="aHR0cHM6Ly9vYXV0aC52ay5jb20vYXl" />

并且名称总是以相同的顺序,那么您可以使用这样的简单正则表达式:

"value\\=\"(.*?)\""

相当于说:

遍历整个字符串,并将 介于 一个看起来像 value=" 的子字符串和一个双引号字符 (") 之间的所有内容分组,因为值你想要的是在双引号内

现在只需遍历找到的项目以收集数据:

while (matcher.find()) 
    System.out.println(matcher.group(1));

如果网页内容中还有其他行也包含标题为value= 的键并且其值也在双引号内,那么现在这根本不会很好地工作。上面的正则表达式示例也会将该数据提取出来,这显然是不好的。正则表达式不够具体,现在将我们带到下一个场景。

场景 2:

在这种特殊情况下,网页内容包含许多行,其中包含标题为 value= 的键及其相关数据值包含在双引号 (") 中。我们显然不希望它们所以我们需要更具体地使用我们的正则表达式。既然我们知道与内容中的 name 键相关的名称,我们试试:

"(\"ip_h\"|\"lg_h\"|\"to\").*value\\=\"(.*?)\""

这里我们使用两个组,我们想要的实际数据将包含在第二组中。第一组使用 RegEx OR 运算符 (|) 来保持简单。上面的正则表达式基本上是在说:

如果遇到 "ip_h""ip_h"" 的名称,请沿整个字符串处理to" AND 直接在该名称之后的某个地方是一个看起来像 value=" 的子字符串,然后获取 value=" 和下一个遇到的 double 之间的数据引号 " 并将其放入第 2 组。

现在只需遍历找到的项目以收集第 2 组中包含的数据:

while (matcher.find()) 
    System.out.println(matcher.group(2));

如果您发现您仍然需要更具体地适应您的正则表达式来执行此操作。您可以添加另一个组。如果你发现它变大了,那么如果你愿意,可以将你的表达式放入一个字符串变量中。

String regEx = "(\\<input type\\=\"hidden\".*)(\"ip_h\"|\"lg_h\"|\"to\").*value\\=\"(.*?)\"";

Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(form);

// The required data ca be obtained from Group 3

以下是您的代码稍作修改:

String form = "123123" +
        "<input type=\"hidden\" name=\"ip_h\" value=\"8d25cea553b4afe087\" />\n" +
        "<input type=\"hidden\" name=\"lg_h\" value=\"e04c5b67874fd6e28b\" />\n" +
        "<input type=\"hidden\" name=\"_origin\" value=\"https://oauth.site.com\" />\n"+
        "<input type=\"hidden\" name=\"to\" value=\"aHR0cHM6Ly9vYXV0aC52ay5jb20vYXl\" />\n";

Pattern pattern = Pattern.compile("(\"ip_h\"|\"lg_h\"|\"to\").*value\\=\"(.*?)\"");
Matcher matcher = pattern.matcher(form);
List<String> foundValues = new ArrayList<>();
while (matcher.find()) 
    foundValues.add(matcher.group(2));


// Display List in Console...
for (int i = 0; i < foundValues.size(); i++) 
    System.out.println(foundValues.get(i));


// If you want to have all the found items placed
// into a one Dimensional String Array then you can
// use this code:
String[] itemsFound = foundValues.toArray(new String[0]);

// Display Array in Console...
System.out.println();
for (int i = 0; i < itemsFound.length; i++) 
    System.out.println(itemsFound[i]);

【讨论】:

以上是关于如何使图案有点清晰? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何制作高清晰的ICO图标

PS如何把隔着玻璃人物照片调清晰

love2d game.exe 在 Windows 中不清晰。如何使游戏清晰(像素游戏)?

如何在 Swift 3 中使这个 UITableView 清晰(透明)

如何使 SKView 的背景颜色清晰

如何使用OpenCV的处理图像,文字变得锐利和清晰