Tag: expression式

为什么使用正则expression式来parsingHTML / XML是不可能的:用外行人的forms作出正式的解释

在SO上没有一天没有问题parsing(X)正则expression式被问到的HTML或XML。 虽然提出示例说明这个任务的正则expression式不可行,或者用一组expression式来表示这个概念,但是我仍然无法find一个正式的解释,为什么这是不可能的条款。 在这个网站上我能find的唯一正式的解释可能是非常准确的,但对于自学成才的程序员来说也是相当隐晦的: 这里的缺陷是HTML是Chomsky Type 2语法(上下文无关语法),RegEx是Chomsky Type 3语法(正则expression式) 要么: 正则expression式只能匹配常规语言,但HTML是一种上下文无关的语言。 要么: 有限自动机(它是正则expression式下面的数据结构)除了它所处的状态之外没有内存,如果有任意深度的嵌套,则需要一个任意大的自动机,它与有穷自动机的概念相冲突。 要么: 正规语言的抽象引理是你不能这样做的原因。 [公平地说:大多数上述解释链接到维基百科页面,但这些并不比答案本身更容易理解]。 所以我的问题是: 有人可能提供一个非专业人士的正式解释为什么不可能使用正则expression式来parsing(X)的HTML / XML的翻译的翻译? 编辑:在阅读第一个答案后,我想我应该澄清:我正在寻找一个“翻译”,也简要解释了它试图翻译的概念:在答案的最后,读者应该有一个大概的想法 – 例如 – “正规语言”和“上下文无关语法”是什么意思

什么是右值,左值,左值,右值和左值?

在C ++ 03中,expression式是右值或左值 。 在C ++ 11中,expression式可以是: 右值 左值 x值 glvalue prvalue 两类分为五类。 什么是这些新的expression类别? 这些新类别如何与现有的右值和左值类别相关联? C ++ 0x中的右值和左值类别与C ++ 03中的相同吗? 为什么需要这些新类别? WG21神只是想把我们这些凡人混为一谈?

如何用链接replace纯文字的URL?

我正在使用下面的函数来匹配给定文本中的URL,并将其replace为HTML链接。 正则expression式运行良好,但是目前我只replace了第一个匹配项。 我如何可以取代所有的url? 我想我应该使用exec命令,但我并没有真正想到如何去做。 function replaceURLWithHTMLLinks(text) { var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i; return text.replace(exp,"<a href='$1'>$1</a>"); }

什么特殊字符必须在正则expression式中转义?

我厌倦了总是试图猜测,如果我应该逃避特殊字符,如' ()[]{}| '等使用正则expression式的很多实现。 例如,Python,sed,grep,awk,Perl,rename,Apache,find等等是不同的。 有什么规则可以告诉我应该什么时候,什么时候不应该逃避特殊字符? 它是否依赖于正则expression式types,如PCRE,POSIX或扩展正则expression式?

正则expression式匹配,排除时间… /除了之间

– 编辑 – 目前的答案有一些有用的想法,但我想要更完整的东西,我可以100%的理解和重用; 这就是为什么我设置赏金。 对于我来说,无处不在的想法也不是像\K这样的标准语法 这个问题是关于如何匹配一个模式,除了一些情况s1 s2 s3。 我给出了一个具体的例子来展示我的意思,但更喜欢一个普遍的答案,我可以100%的理解,所以我可以在其他情况下重用。 例 我想用\b\d{5}\b匹配五个数字,但是在三种情况下不能匹配s1 s2 s3: s1:不在以这句话结束的句子中。 s2:没有在parens内的任何地方。 s3:不在以if(开头的块中if(并以//endif结尾 我知道如何用向前和向后的方式解决s1 s2 s3中的任何一个,特别是在C#lookbehind或PHP中的\K 例如 s1 (?m)(?!\d+.*?\.$)\d+ s3 with C#lookbehind (?<!if\(\D*(?=\d+.*?//endif))\b\d+\b s3用PHP \ K (?:(?:if\(.*?//endif)\D*)*\K\d+ 但条件的混合在一起使我的头部爆炸。 更坏的消息是,我可能需要另外添加其他条件s4 s5。 好消息是,我不在乎是否使用PHP,C#,Python或邻居的洗衣机等大多数常用语言来处理这些文件。 :)我几乎是Python和Java的初学者,但有兴趣了解它是否有解决scheme。 所以我来这里看看是否有人想到一个灵活的配方。 提示是好的:你不需要给我完整的代码。 🙂 谢谢。

是正则expression式的gcc 4.8或更早的车?

我正在尝试在C ++ 11代码中使用std :: regex,但看起来支持是有点bug。 一个例子: #include <regex> #include <iostream> int main (int argc, const char * argv[]) { std::regex r("st|mt|tr"); std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl; std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl; std::cerr << "st|mt|tr" << " matches tr? " […]

惰性和贪婪在正则expression式中是什么意思?

有人能用一种可以理解的方式解释这两个术语吗?

你如何在正则expression式中使用variables?

我想在JavaScript中创build一个String.replaceAll()方法,我想使用正则expression式将是最简单的方法来做到这一点。 但是,我不知道如何将一个variables传递给RegEx。 我已经可以做到这一点,它将用“A”代替“B”的所有实例。 "ABABAB".replace(/B/g, "A"); 但是我想要做这样的事情: String.prototype.replaceAll = function(replaceThis, withThis) { this.replace(/replaceThis/g, withThis); }; 但显然这只会取代文本“replaceThis”…所以如何将这个variables传递给我的RegExstring?

正则expression式可以用来匹配嵌套模式吗?

是否可以编写一个正则expression式来匹配发生未知次数的嵌套模式? 例如,如果在外括号内嵌套了未知数量的打开/closures大括号,则正则expression式是否可以匹配打开和closures大括号? 例如: public MyMethod() { if (test) { // More { } } // More { } } // End 应该匹配: { if (test) { // More { } } // More { } }

Javascript中是否有RegExp.escape函数?

我只是想从任何可能的string中创build一个正则expression式。 var usersString = "Hello?!*`~World()[]"; var expression = new RegExp(RegExp.escape(usersString)) var matches = "Hello".match(expression); 有没有内置的方法呢? 如果不是,人们使用什么? Ruby有RegExp.escape 。 我不觉得自己需要写自己的东西,那里就有标准。 谢谢!