我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z
.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/
,然后我有这个权利吗?更重要的是,你怎么看?
我正在尝试<input>
使用此模式匹配类型"隐藏"字段:
/<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/
Run Code Online (Sandbox Code Playgroud)
这是示例表单数据:
<input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" />
Run Code Online (Sandbox Code Playgroud)
但我不知道的type
,name
和value
属性将始终出现在相同的顺序.如果type
属性是最后一个,则匹配将失败,因为在我的模式中,它在开始时.
问题:
如何更改模式以使其匹配,无论<input>
标签中属性的位置如何?
PS:顺便说一下,我正在使用基于Adobe Air的RegEx桌面工具来测试正则表达式.
我需要以最有效的方式替换字符串中的许多不同的子字符串.除了使用string.replace替换每个字段的蛮力方式之外还有另一种方法吗?
当我比较Apache的性能StringUtils.replace()
VS String.replace()
我很惊讶地知道,前者是快约4倍.我使用Google的Caliper框架来衡量效果.这是我的考试
public class Performance extends SimpleBenchmark {
String s = "111222111222";
public int timeM1(int n) {
int res = 0;
for (int x = 0; x < n; x++) {
res += s.replace("111", "333").length();
}
return res;
}
public int timeM2(int n) {
int res = 0;
for (int x = 0; x < n; x++) {
res += StringUtils.replace(s, "111", "333", -1).length();
}
return res;
}
public static void main(String... args) {
Runner.main(Performance.class, args);
} …
Run Code Online (Sandbox Code Playgroud) 我想要一个有效的算法(或库),我可以在Java中使用它来搜索字符串中的子串.
我想做的是:
给定一个输入字符串 - INSTR:
"BCDEFGH"
还有一组候选字符串--CAND:
"AB","CDE","FG","H","IJ"
在INSTR中查找匹配为子字符串的任何CAND字符串
在这个例子中,我将匹配"CDE","FG"和"H"(但不是"AB"和"IJ")
可能有数千个候选字符串(在CAND中),但更重要的是,我将进行数百万次搜索,因此我需要它快速.
我想使用char数组.此外,我并不喜欢建筑解决方案,例如分发搜索 - 只是在本地进行搜索的最有效的功能/算法.
另外,CAND和INSTR中的所有字符串都将相对较小(<50个字符) - 即目标字符串INSTR相对于候选字符串不长.
我应该提到的更新,在所有INSTR值中,CAND字符串集是不变的.
更新我只需要知道有匹配 - 我不需要知道匹配是什么.
最终更新 由于实施简单,我选择尝试AhoCorsick和Rabin-Karp.因为我有可变长度模式,所以我使用了一个修改过的Rabin-Karp,它会散列每个模式的前n个字符,其中n是最小模式的长度,N则是我的滚动子字符串搜索窗口的长度.对于Aho Corsick,我用过这个
在我的测试中,我在两篇文档新闻论文中搜索了1000个模式,平均1000次迭代等...标准化时间完成:
AhoCorsick:1
拉宾卡尔普:1.8
天真搜索(检查每个模式并使用string.contains):50
*描述以下答案中提到的算法的一些资源:
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html
http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2x2.pdf
我有一个类似模式的长htdoc,继续这样:
<td class="MODULE_PRODUCTS_CELL " align="center" valign="top" height="100">
<table width="100" summary="products"><tr>
<td align="center" height="75">
<a href="/collections.php?prod_id=50">
<img src="files/products_categories50_t.txt" border="0" alt="products" /></a><\br>
</td>
</tr>
<tr>
<td align="center">
<a href="/collections.php?prod_id=50"><strong>Buffer</strong><br />
</a>
<td>
</tr></table>
</td>
Run Code Online (Sandbox Code Playgroud)
在上面的html中我想提取:
collections.php?prod_id=50
files/products_categories50_t.txt
Buffer
我已经尝试过这段代码,
#!/usr/local/bin/perl
use strict;
use warnings;
my $filename = 'sr.txt';
open(FILENAME,$filename);
my @str = <FILENAME>;
chomp(@str);
#print "@str";
foreach my $str(@str){
if ($str =~/<td class(.*)<a href(.*?)><\/td>/) {
print "*****$2\n";
}
}
Run Code Online (Sandbox Code Playgroud)
此代码是试用版.然而,它只带来最后一次出现,而不是每次出现.为什么?
假设我在一个替换1,000个匹配实例的大字符串上调用了replaceAll().这是否意味着由于字符串不变性而创建并重新分配了1,000个字符串?还有更快的选择吗?