正则表达式 - 匹配每个可能的字符和空格

时间:2016-05-03 14:08:50

标签: regex

我想从html中提取数据。问题是,我无法提取位于顶部和底部的2个字符串。

我想提取234234234231234523453245,但只有,如果之间有字符Allan

                                        <h4><a href="/Profile/23423423423.html">@@@@@@</a>  </h4> said12:49:32
            </div>

                                <a href="javascript:void(0)" onclick="replyAnswer(@@@@@@@@@@,'GET','');" class="reportLink">
                    report                    </a>
                        </div>

        <div class="details">
                            <p class="content">


                       Hi there, Allan.



                                </p>

            <div id="AddAnswer1234523453245"></div>

当然,我可以这样做:Profile\/(\d+).*\s*.*\s*.*\s*.*\s*.*\s*.*\s*.*\s*.*Allan.*\s*.*\s*.*AddAnswer(\d+)。但代码太可怕了。有没有解决方案让它更短?

我在考虑:

Profile\/(\d+)(.\sAllan)*AddAnswer(\d+)

Profile\/(\d+)(.*Allan\s*)*AddAnswer(\d+)

但wchich都没有正常工作。你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用[\S\s]构建一个字符组,以匹配任何字符,包括换行符。所有空格和非空格字符都是字符。

然后,你的尝试相当接近

/Profile\/(\d+)[\S\s]*Allan[\S\s]*AddAnswer(\d+)/

这将查找配置文件,其后面的数字,Allan之前的任何字符,AddAnswer之前的任何字符以及之后的数字。如果您有单行模式(/s),那么您可以改为使用点。

/Profile\/(\d+).*Allan.*AddAnswer(\d+)/s

demo

答案 1 :(得分:0)

您可以使用m指定.来匹配换行符。

/Profile\/(\d+).+AddAnswer(\d+)/m

答案 2 :(得分:0)

Better use a parser instead。如果您出于某种原因必须使用正则表达式,那么您可能会使用tempered greedy solution

Profile/(\d+)            # Profile followed by digits
(?:(?!Allan)[\S\s])+     # any character except when there's Allan ahead
Allan                    # Allan literally
(?:(?!AddAnswer)[\S\s])+ # same construct as above
AddAnswer(\d+)           # AddAnswer, followed by digits

查看 demo on regex101.com