我需要匹配所有这些开始标记:
<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)
我相信它说:
/
,然后我有这个权利吗?更重要的是,你怎么看?
一个错误我看到人们做了,并再次试图解析XML或HTML用正则表达式.以下是解析XML和HTML很难的几个原因:
人们希望将文件视为一系列行,但这是有效的:
<tag
attr="5"
/>
Run Code Online (Sandbox Code Playgroud)
人们希望将<或<tag视为标记的开头,但是这样的东西存在于野外:
<img src="imgtag.gif" alt="<img>" />
Run Code Online (Sandbox Code Playgroud)
人们通常希望将起始标记与结束标记匹配,但XML和HTML允许标记包含自身(传统的正则表达式根本无法处理):
<span id="outer"><span id="inner">foo</span></span>
Run Code Online (Sandbox Code Playgroud)
人们通常希望匹配文档的内容(例如着名的"查找给定页面上的所有电话号码"问题),但数据可能会被标记(即使在查看时看起来是正常的):
<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>
Run Code Online (Sandbox Code Playgroud)
评论可能包含格式不正确或不完整的标记:
<a href="foo">foo</a>
<!-- FIXME:
<a href="
-->
<a href="bar">bar</a>
Run Code Online (Sandbox Code Playgroud)
你还知道其他什么问题?
是否可以编写与未出现次数的嵌套模式匹配的正则表达式?例如,当外括号内嵌有未知数量的打开/关闭括号时,正则表达式是否可以匹配开括号和右括号?
例如:
public MyMethod()
{
if (test)
{
// More { }
}
// More { }
} // End
Run Code Online (Sandbox Code Playgroud)
应该匹配:
{
if (test)
{
// More { }
}
// More { }
}
Run Code Online (Sandbox Code Playgroud) 在没有关于解析(X)HTML或XML并且询问正则表达式的问题的情况下,SO上没有任何日子.
虽然相对容易想出用于演示此任务的正则表达式的不可行性的示例或用表达概念的表达式集合,我仍然无法在SO上找到为什么在外行人中无法做到这一点的正式解释条款.
到目前为止我在这个网站上找到的唯一正式解释可能非常准确,但对于自学成才的程序员来说也很神秘:
这里的缺陷是HTML是Chomsky Type 2语法(无上下文语法)而RegEx是Chomsky Type 3语法(正则表达式)
要么:
正则表达式只能匹配常规语言,但HTML是无上下文的语言.
要么:
有限自动机(它是正则表达式下面的数据结构)除了它所处的状态之外没有内存,如果你有任意深度的嵌套,你需要一个任意大的自动机,它与有限自动机的概念相冲突.
要么:
常规语言的Pumping引理是你不能这样做的原因.
[公平地说:以上大多数解释链接到维基百科页面,但这些并不比答案本身更容易理解].
所以我的问题是:有人可以提供一个外行人的上述正式解释的翻译,为什么不可能使用正则表达式来解析(X)HTML/XML?
编辑:在读完第一个答案之后,我认为我应该澄清:我正在寻找一个"翻译",它也简要地解释了它试图翻译的概念:在答案的最后,读者应该有一个粗略的想法 - 例如 - "常规语言"和"无语境语法"是什么意思......
我有一个存储在表格中的Html片段.不是整页,没有标签等,只是基本的格式.
我希望能够在给定页面上显示Html仅作为文本,没有格式化(实际上只是前30到50个字符,但这很容易).
如何将该Html中的"文本"作为直文放入字符串中?
所以这段代码.
<b>Hello World.</b><br/><p><i>Is there anyone out there?</i><p>
Run Code Online (Sandbox Code Playgroud)
变为:
你好,世界.有没有人在那里?
如何从字符串中删除HTML标记,以便输出干净的文本?
let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)
Run Code Online (Sandbox Code Playgroud) 我不是在谈论类似XHTML的代码.我正在谈论像这个疯狂的标记,这是完全有效的HTML(!)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html<head>
<title//
<p ltr<span id=p></span</p>
</>
Run Code Online (Sandbox Code Playgroud)
因此,鉴于SGML注入的巨大复杂性,HTML是一种无上下文的语言吗?这是一种正式的语言吗?用语法?
HTML5怎么样?
我是正式语言概念的新手,所以请耐心等待.是的,我已阅读维基百科的文章;)
众所周知,现代正则表达式实现(最值得注意的是PCRE)与常规语法的原始概念几乎没有共同之处.例如,您可以解析无上下文语法的经典示例{a n b n ; n> 0}(例如aaabbb
)使用此正则表达式(演示):
~^(a(?1)?b)$~
Run Code Online (Sandbox Code Playgroud)
我的问题是:你能走多远?是否也可以使用PCRE 解析上下文敏感的语法 {a n b n c n ; n> 0}(例如aaabbbccc
)?