在探索正则表达式(也称为RegEx-es)时,有许多人似乎将正则表达式视为圣杯.看起来如此复杂的东西 - 只是必须回答任何问题.他们倾向于认为使用正则表达式可以解决所有问题.
另一方面,也有许多人试图不惜一切代价避免使用正则表达式.他们试图找到解决正则表达式的方法并接受额外的编码只是为了它,即使正则表达式是一个更紧凑的解决方案.
为什么正则表达式被认为是如此有争议?是否存在关于它们如何工作的普遍误解?或者可能是一个普遍的信念,正则表达式通常很慢?
更新/注意事项:
(仔细读:)
我有一个包含可变数量的段(简化)的字符串:
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Run Code Online (Sandbox Code Playgroud)
我想现在匹配段并通过匹配数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Run Code Online (Sandbox Code Playgroud)
这只会返回捕获组2 的最后一个匹配:DD.
有没有办法,我可以检索所有的子模式捕获(的方式AA,BB,DD)与一个正则表达式执行?不preg_match_all适合这个吗?
无论是$subject和$pattern简化.自然地与这样的通用列表AA,BB..是更容易与其它功能(例如,以提取explode),或与的的变化$pattern.
但我特别询问如何使用preg_...-family函数返回所有子组匹配.
对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量.
这是用于描述一些背景的伪代码的示例.想象一下:
令牌的常规定义:
CHARS := [a-z]+
PUNCT := …Run Code Online (Sandbox Code Playgroud) 我有一个类似模式的长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.txtBuffer我已经尝试过这段代码,
#!/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)
此代码是试用版.然而,它只带来最后一次出现,而不是每次出现.为什么?
TCL:任何人都能解释一下吗?:正则表达式
我之间感到困惑?和?:.
?表示前面的字符可能存在,也可能不存在.
然后我不明白是什么(?:)表示.
任何人都可以请解释一下.
([0-9]+(?:\.[0-9]*)?)
Run Code Online (Sandbox Code Playgroud)