Javascript 如何找到所有具有正则表达式的猫

Javascript 如何找到所有具有正则表达式的猫,javascript,python,html,regex,sublimetext2,Javascript,Python,Html,Regex,Sublimetext2,如何找到所有带有正则表达式的“cat” 有些人在遇到问题时会想:“我知道,我会用 正则表达式。“现在他们有两个问题!”(c)杰米·扎温斯基 请帮助我通过单个查询查找div中的所有“cat”: cat 让我们试着找到这只猫和这只猫 猫 让我们试着找到这只猫和这只猫 猫 我必须这样做,但它不起作用: (?<=<div>)((?!<\/div>)(cat|(?:.|\n))+)(?=<\/div>) (?PHP模式: $pattern = '~(?>

如何找到所有带有正则表达式的“cat”

有些人在遇到问题时会想:“我知道,我会用 正则表达式。“现在他们有两个问题!”(c)杰米·扎温斯基

请帮助我通过单个查询查找div中的所有“cat”:

cat
让我们试着找到这只猫和这只猫
猫
让我们试着找到这只猫和这只猫
猫
我必须这样做,但它不起作用:

(?<=<div>)((?!<\/div>)(cat|(?:.|\n))+)(?=<\/div>)
(?PHP模式:

$pattern = '~(?><div\b[^>]*+>|\G(?<!^))(?>[^c<]++|\Bc|c(?!at\b)|<(?!/div>))*+\Kcat~';
preg_match_all($pattern, $subject, $matches);
print_r($matches);

考虑到您没有指定需要使用哪种语言,我将使用JavaScript实现此解决方案

您可以使用一个简单的技巧来完成此操作,即删除所有垃圾:

var string = "<div>let's try to find this cat and this cat</div>\n<div>let's try to find this cat and this cat</div>\nanother cat";
var str = string.replace(/(^|<\/div>)[\w\W]*?(<div>|$)/g,''); //filters out anything outside divs
console.log(str.match(/cat/g)); // ["cat", "cat", "cat", "cat"]
var string=“让我们试着找到这只猫和这只猫\n让我们试着找到这只猫和这只猫\n另一只猫”;
var str=string.replace(/(^ |))[\w\w]*?(|$)/g',;//过滤掉div之外的任何内容
console.log(str.match(/cat/g));//[“cat”、“cat”、“cat”、“cat”]
在一行中,这将是:

console.log("<div>let's try to find this cat and this cat</div>\n<div>let's try to find this cat and this cat</div>\nanother cat".replace(/(^|<\/div>)[\w\W]*?(<div>|$)/g,'').match(/cat/g)); // ["cat", "cat", "cat", "cat"]
console.log(“让我们尝试查找这只猫和这只猫\n让我们尝试查找这只猫和这只猫\n另一只猫”。替换(/(^ |))[\w\w]*?(^$)/g',)。匹配(/cat/g));/[“猫”,“猫”,“猫”,“猫”]
即使在您需要匹配以下内容时,也要使此功能正常工作:

<div class="foo"><div></div>cat</div>
cat
我会使用以下方法:

var str = "<div>let's try to find this cat and this cat</div>\n<div>let's try to find this cat and this cat</div>\nanother cat\n<div class=\"foo\"><div></div>and a cat</div>";
var openCounter = 0;
var result = [];
for (var i=0;i<str.length;i++) {
    if (str.substr(i,4) == '<div') openCounter++;
    else if (str.substr(i,6) == '</div>') openCounter = Math.max(0,openCounter-1); //don't go lower than 0
    if (openCounter > 0 && str.substr(i,3) == 'cat') result.push([str.substr(i,3), i]);
}
console.log(JSON.stringify(result)); //[["cat",28],["cat",41],["cat",79],["cat",92],["cat",148]]
var str=“让我们试着找到这只猫和这只猫\n让我们试着找到这只猫和这只猫\n另一只猫\n和一只猫”;
var-openCounter=0;
var结果=[];

对于(var i=0;i,这适用于崇高文本:

(?s)(cat)(?=[^>]*?</div>)
(?s)(cat)(?=[^>]*?)

使用正则表达式无法可靠地实现这一点(正如其他人所提到的)

原因是HTML可以包含嵌套标记,但正则表达式无法“计算”您的深度,因此您将始终能够构造某个HTML示例的示例,而您的正则表达式无法找到所有的猫

要解析HTML,需要使用堆栈跟踪标记的深度。在这个python示例中,我使用序列(
self.tags
)作为堆栈:

from HTMLParser import HTMLParser
import re

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tags = []

    def handle_starttag(self, tag, attrs):
        self.tags.append(tag)

    def handle_endtag(self, tag):
        self.tags.pop()

    def handle_data(self, data):
        if self.tags and self.tags[-1] == 'div':
            # now we are dealing with a single string.
            # use a regular expression to find all cats
            num = len(re.findall('cat', data))
            if num:
                print 'found %d cats at %s' % (num, '.'.join(self.tags))

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('''
cat
<div>let's try to find this cat and this cat</div>
cat
<div>let's try to find this cat and this cat</div>
cat
''')

# now try a trickier example
parser.feed('''<body><div>cat<div>another text</div></div></body>''')
这也很容易扩展到仅基于class属性匹配特定div。
(请参阅
handle\u starttag
attrs
参数。

您真正想要的是单词“cat”还是整个标记?olgash,是的,所有cat都隐藏在divs中:)查找“cat”的最简单正则表达式是………
cat
。除非您指定其他要求,否则没有理由做得更复杂。当涉及到解析任何XML文档(HTML或其他)时,regex通常是错误的工具。实际上,没有办法编写一个regex来匹配
cat
s和
s的所有可能排列(例如,@casimir et hippolyte下面的答案将无法通过此测试:
cat
)。感谢您的模式!但我什么都没有得到-Array([0]=>Array())还有很长的正则表达式!谢谢!我可以用一个查询来完成吗?@DopustimVladimir这就是你要找的吗?这也没有通过测试
cat
。乔伊特杰50,再次感谢你!这不是我想要的,但它是很酷的变体。让我编辑我的post@asgallant,是的,它返回nulllet让我们试着找到这只猫和这只猫喂,我是cat让我们试着找到这只猫和这只猫。是的,非常感谢!现在这是对我最有用的答案,它真的很有效。然后让我们再问一个问题!我们可以用一些类为divs做这个,但不是另一个divs吗?catcatcatex这个正则表达式在
其他文本
中失败。有人提到过解析像Html/XML这样的递归结构吗Eith正则表达式不起作用?
<div class="foo"><div></div>cat</div>
var str = "<div>let's try to find this cat and this cat</div>\n<div>let's try to find this cat and this cat</div>\nanother cat\n<div class=\"foo\"><div></div>and a cat</div>";
var openCounter = 0;
var result = [];
for (var i=0;i<str.length;i++) {
    if (str.substr(i,4) == '<div') openCounter++;
    else if (str.substr(i,6) == '</div>') openCounter = Math.max(0,openCounter-1); //don't go lower than 0
    if (openCounter > 0 && str.substr(i,3) == 'cat') result.push([str.substr(i,3), i]);
}
console.log(JSON.stringify(result)); //[["cat",28],["cat",41],["cat",79],["cat",92],["cat",148]]
(?s)(cat)(?=[^>]*?</div>)
from HTMLParser import HTMLParser
import re

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tags = []

    def handle_starttag(self, tag, attrs):
        self.tags.append(tag)

    def handle_endtag(self, tag):
        self.tags.pop()

    def handle_data(self, data):
        if self.tags and self.tags[-1] == 'div':
            # now we are dealing with a single string.
            # use a regular expression to find all cats
            num = len(re.findall('cat', data))
            if num:
                print 'found %d cats at %s' % (num, '.'.join(self.tags))

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('''
cat
<div>let's try to find this cat and this cat</div>
cat
<div>let's try to find this cat and this cat</div>
cat
''')

# now try a trickier example
parser.feed('''<body><div>cat<div>another text</div></div></body>''')
found 2 cats at div
found 2 cats at div
found 1 cats at body.div