在没有关于解析(X)HTML或XML并且询问正则表达式的问题的情况下,SO上没有任何日子.
虽然相对容易想出用于演示此任务的正则表达式的不可行性的示例或用表达概念的表达式集合,我仍然无法在SO上找到为什么在外行人中无法做到这一点的正式解释条款.
到目前为止我在这个网站上找到的唯一正式解释可能非常准确,但对于自学成才的程序员来说也很神秘:
这里的缺陷是HTML是Chomsky Type 2语法(无上下文语法)而RegEx是Chomsky Type 3语法(正则表达式)
要么:
正则表达式只能匹配常规语言,但HTML是无上下文的语言.
要么:
有限自动机(它是正则表达式下面的数据结构)除了它所处的状态之外没有内存,如果你有任意深度的嵌套,你需要一个任意大的自动机,它与有限自动机的概念相冲突.
要么:
常规语言的Pumping引理是你不能这样做的原因.
[公平地说:以上大多数解释链接到维基百科页面,但这些并不比答案本身更容易理解].
所以我的问题是:有人可以提供一个外行人的上述正式解释的翻译,为什么不可能使用正则表达式来解析(X)HTML/XML?
编辑:在读完第一个答案之后,我认为我应该澄清:我正在寻找一个"翻译",它也简要地解释了它试图翻译的概念:在答案的最后,读者应该有一个粗略的想法 - 例如 - "常规语言"和"无语境语法"是什么意思......
每当我看到任何正则表达式时,我总是害怕.我觉得很难理解.但恐惧不是解决方案.我决定开始学习正则表达式,所以有人可以告诉我如何才能开始吗?如果有任何简单的教程?
我们都知道正确验证电子邮件的正则表达式会非常复杂.但是,jQuery的验证插件有一个较短的正则表达式(由Scott Gonzalez提供),只有几行:
/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])
+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|
((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|
[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]
|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?
(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*
([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])
([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/
Run Code Online (Sandbox Code Playgroud)
与更为人熟知的怪物相比,为什么这么"简单"?是否存在一个正则表达式失败而另一个正式成功的情况(案例是有效还是无效的电子邮件)?
完全重复:使用正则表达式验证电子邮件地址
什么是有效的电子邮件地址字符和模式,以及如何编写与之匹配的正则表达式?
我正在试验PHP的PCRE中的命名子模式/'子程序'正则表达式功能,我希望有人可以解释以下奇怪的输出:
$re = "/
(?(DEFINE)
(?<a> a )
)
^(?&a)$
/x";
var_dump(preg_match($re, 'a', $match)); // (int) 1 as expected
var_dump($match); // Array( [0] => 'a' ) <-- Why?
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么命名组"a"不在结果中(内容为"a").更改preg_match为preg_match_all在匹配数据中放置"a"和"1",但两者仅包含空字符串.
我非常喜欢用这种方式编写正则表达式的想法,因为你可以使它们非常强大,同时保持它们非常易于维护(请参阅这个答案以获得一个很好的例子),但是如果子模式在匹配数据中不可用那么它不是真的很有用.
我在这里遗漏了什么,或者我应该哀悼可能发生的事情并继续前进?
好的,所以我对regexps一般都是新手,更不用说Javascript了.
我正在尝试一个表单验证项目,我找到了一个站点,他们在这里有各种有用的示例正则表达式列表,其中有一些用于电子邮件验证,这是我目前正在尝试的.
无论如何,按照这个w3schools表单验证的例子,我能够使用他们的例子让它正常工作,并且regexp在javascript函数之外工作,但由于某些原因,当我在函数内部调用它时,它返回一个undefined值.
这是我的代码:
<html>
<head>
<title>formzz validate-jons</title>
<script type="text/javascript">
pattern = new RegExp("^[0-9a-zA-Z]+@[0-9a-zA-z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$");
function valid8email(field, txt)
{
with(field)
{
//at_pos = value.indexOf('@');
//dot_pos = value.lastIndexOf('.');
if(!pattern.test(value)) //at_pos < 1 || (dot_pos - at_pos) < 2)
{
alert(txt);
return false;
}
else
{
return true;
}
}
}
function valid8(form)
{
with(form)
{
if(valid8email(email, "you must enter an email address") == false)
{
email.focus();
return false;
}
}
}
</script>
</head>
<body>
<form action="#" method="POST" onsubmit="return valid8(this)">
Email: …Run Code Online (Sandbox Code Playgroud) 我们如何使用JavaScript从后面每3个字符拆分一个字符串?
说,我有这个:
str = 9139328238
Run Code Online (Sandbox Code Playgroud)
在所需的功能之后,它将变为:
parts = ['9','139','328','238']
Run Code Online (Sandbox Code Playgroud)
我们如何优雅地做到这一点?
我有一个像这样的HTML字符串:
<img src="http://foo"><img src="http://bar">
Run Code Online (Sandbox Code Playgroud)
将此分成两个独立的img标签的正则表达式模式是什么?
我不想重复Cthulhu的答案,但我希望使用Treetop匹配开启和关闭HTML标签的对.使用这个语法,我可以匹配开始标记和结束标记,但现在我想要一个规则将它们绑在一起.我已尝试过以下内容,但使用此方法会使我的解析器永远继续(无限循环):
rule html_tag_pair
html_open_tag (!html_close_tag (html_tag_pair / '' / text / newline /
whitespace))+ html_close_tag <HTMLTagPair>
end
Run Code Online (Sandbox Code Playgroud)
我试图将此基于递归括号示例和Treetop Github页面上的否定前瞻示例.我引用的其他规则如下:
rule newline
[\n\r] {
def content
:newline
end
}
end
rule tab
"\t" {
def content
:tab
end
}
end
rule whitespace
(newline / tab / [\s]) {
def content
:whitespace
end
}
end
rule text
[^<]+ {
def content
[:text, text_value]
end
}
end
rule html_open_tag
"<" html_tag_name attribute_list ">" <HTMLOpenTag>
end
rule html_empty_tag …Run Code Online (Sandbox Code Playgroud) 我试图搜索文本文件并找到有效的电子邮件地址.我做这样的事情:
#!/usr/bin/perl -w
my $infile = 'emails.txt';
open IN, "< $infile" or die "Can't open $infile : $!";
while( <IN> )
{
if ($infile =~ /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/)
{
print "Valid \n";
}
}
close IN;
Run Code Online (Sandbox Code Playgroud)
但它没有做任何事情,任何帮助?