Page 1 of 1

【已解决】求助 一个 正则表达式

Posted: 27 May 2015, 21:10
by youwantme
需要处理的文本:<h1>正则表达式就是牛</h1></div>
目的:取得中间的中文内容,即“正则表达式就是牛”几个字,实际上就是要获取“<h1>”和“</h1>”这两个标记之间的内容

参考了本站“正则表达式快速入门”的帖子,依样画葫芦写了以下代码:

Code: Select all

	Haystack := "<h1>正则表达式就是牛</h1></div>"
	FoundPos1 := RegExMatch(Haystack, "<h1>(.*)</h1>", Match1, 1)
	MsgBox, % Match1
结果:获取到的文本为:
    <h1>正则表达式就是牛</h1>

求教大神:有没有办法不要两头的标签,直接获取“正则表达式就是牛”这段文本?

正则纯小白,谢谢啦!

Re: 求助 一个 正则表达式

Posted: 28 May 2015, 02:19
by tmplinshi
MsgBox, % Match11。后面跟数字 1,2,3...n 表示子匹配项。

另外,最好用 .*?.*? 是匹配第一个出现的字符,而 .* 是匹配最后出现的字符。示例代码:

Code: Select all

str := "<h1>正则表达式就是牛</h1><h1>测试</h1></div>"
RegExMatch(str, "<h1>(.*)</h1>", m) ; .*</h1> 会匹配到最后一个 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛</h1><h1>测试

RegExMatch(str, "<h1>(.*?)</h1>", m) ; .*?</h1> 只匹配到第一个碰到的 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛
Return

Re: 求助 一个 正则表达式

Posted: 28 May 2015, 02:28
by youwantme
兄太牛了,真心好用,哈哈。谢啦!
tmplinshi wrote:MsgBox, % Match11。后面跟数字 1,2,3...n 表示子匹配项。

另外,最好用 .*?.*? 是匹配第一个出现的字符,而 .* 是匹配最后出现的字符。示例代码:

Code: Select all

str := "<h1>正则表达式就是牛</h1><h1>测试</h1></div>"
RegExMatch(str, "<h1>(.*)</h1>", m) ; .*</h1> 会匹配到最后一个 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛</h1><h1>测试

RegExMatch(str, "<h1>(.*?)</h1>", m) ; .*?</h1> 只匹配到第一个碰到的 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛
Return

Re: 求助 一个 正则表达式

Posted: 28 May 2015, 21:35
by youwantme
tmplinshi兄:还想再求教一下,如果第一个标签中包含有双引号,该怎么处理?比如之前那个例子,第一个标签是 <h1>,如果这个标签是 <h"1>呢(必须包含双引号,即第一个标签是<h"1>,而不是1>),请问该怎样匹配?


tmplinshi wrote:MsgBox, % Match11。后面跟数字 1,2,3...n 表示子匹配项。

另外,最好用 .*?.*? 是匹配第一个出现的字符,而 .* 是匹配最后出现的字符。示例代码:

Code: Select all

str := "<h1>正则表达式就是牛</h1><h1>测试</h1></div>"
RegExMatch(str, "<h1>(.*)</h1>", m) ; .*</h1> 会匹配到最后一个 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛</h1><h1>测试

RegExMatch(str, "<h1>(.*?)</h1>", m) ; .*?</h1> 只匹配到第一个碰到的 </h1>
MsgBox, % m1 ; 结果 --> 正则表达式就是牛
Return

Re: 【已解决】求助 一个 正则表达式

Posted: 28 May 2015, 21:38
by tmplinshi
RegExMatch(str, "<h""1>(.*?)</h1>", m)
或者
RegExMatch(str, "<h\x221>(.*?)</h1>", m)

Re: 【已解决】求助 一个 正则表达式

Posted: 28 May 2015, 22:22
by youwantme
谢谢!搞定 :)
tmplinshi wrote:RegExMatch(str, "<h""1>(.*?)</h1>", m)
或者
RegExMatch(str, "<h\x221>(.*?)</h1>", m)

Re: 【已解决】求助 一个 正则表达式

Posted: 29 May 2015, 03:38
by youwantme
再求教 tmplinshi 兄:

带逗号的字符串,怎么匹配?

比如这个字符串:[1,1],[1,2],[1,3]

第一个标签是 [1,
第二个标签是 ]

请问如何把2和3匹配出来?

谢谢!

tmplinshi wrote:RegExMatch(str, "<h""1>(.*?)</h1>", m)
或者
RegExMatch(str, "<h\x221>(.*?)</h1>", m)

Re: 【已解决】求助 一个 正则表达式

Posted: 29 May 2015, 04:40
by tmplinshi
[] 这两个字符需要用反斜杠“\”进行转义。

Code: Select all

RegExMatch("[1,1],[1,2],[1,3]", "\[.*?\[\d+,(\d+).*?\[\d+,(\d+)", m)
MsgBox, % m1 A_Tab m2
帮助文件有一页简单的正则教程,可以去看看。

Re: 【已解决】求助 一个 正则表达式

Posted: 30 May 2015, 01:00
by youwantme
谢谢!搞着搞着慢慢摸出一点门道了,呵呵
tmplinshi wrote:[] 这两个字符需要用反斜杠“\”进行转义。

Code: Select all

RegExMatch("[1,1],[1,2],[1,3]", "\[.*?\[\d+,(\d+).*?\[\d+,(\d+)", m)
MsgBox, % m1 A_Tab m2
帮助文件有一页简单的正则教程,可以去看看。

Re: 【已解决】求助 一个 正则表达式

Posted: 01 Jun 2015, 02:17
by youwantme
再次求教 tmplinshi 兄:

请问类似于这样的文本,行数不确定,但格式一致,如何用正则表达式把后面的网址都匹配挑选出来,放入数组中?

Code: Select all

<link rel='dns-prefetch' href="http://imgt6.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt7.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt8.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt9.bdstatic.com" />
<link rel='dns-prefetch' href="http://a.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://b.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://c.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://d.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://e.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://f.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://g.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://h.hiphotos.baidu.com" />
感谢!
tmplinshi wrote:[] 这两个字符需要用反斜杠“\”进行转义。

Code: Select all

RegExMatch("[1,1],[1,2],[1,3]", "\[.*?\[\d+,(\d+).*?\[\d+,(\d+)", m)
MsgBox, % m1 A_Tab m2
帮助文件有一页简单的正则教程,可以去看看。

Re: 【已解决】求助 一个 正则表达式

Posted: 01 Jun 2015, 04:14
by tmplinshi
指定 m) 参数,则只匹配单行。

Code: Select all

src =
(
<link rel='dns-prefetch' href="http://imgt6.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt7.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt8.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt9.bdstatic.com" />
<link rel='dns-prefetch' href="http://a.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://b.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://c.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://d.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://e.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://f.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://g.hiphotos.baidu.com" />
)

src := RegExReplace(src, "m`ai)^.*href=""(.*?)"".*", "$1")
src := RegExReplace(src, "\R+", "`n")
src := Trim(src, "`n")
urls := StrSplit(src, "`n")
MsgBox, % "网址数量:" urls.MaxIndex() "`n第一条网址:" urls.1
Return
如果代码中的哪个正则符号不懂,可以看 http://ahkscript.org/docs/misc/RegEx-QuickRef.htm 里面的说明。

Re: 【已解决】求助 一个 正则表达式

Posted: 01 Jun 2015, 04:23
by tmplinshi
另一个方法是用 DOM

Code: Select all

src =
(
<link rel='dns-prefetch' href="http://imgt6.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt7.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt8.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt9.bdstatic.com" />
<link rel='dns-prefetch' href="http://a.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://b.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://c.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://d.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://e.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://f.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://g.hiphotos.baidu.com" />
)

doc := ComObjCreate("HtmlFile")
doc.Write(src), doc.Close()

urls := []
Loop, % doc.all.tags("link").Length
    urls.Push( doc.all.tags("link")[A_Index-1].href ) ; 因为 DOM 的数组是 0 开头的,所以要减 1
    
MsgBox, % "网址数量:" urls.MaxIndex() "`n第一条网址:" urls.1
Return

Re: 【已解决】求助 一个 正则表达式

Posted: 01 Jun 2015, 05:45
by youwantme
感谢兄台耐心解答!
tmplinshi wrote:另一个方法是用 DOM

Code: Select all

src =
(
<link rel='dns-prefetch' href="http://imgt6.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt7.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt8.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt9.bdstatic.com" />
<link rel='dns-prefetch' href="http://a.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://b.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://c.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://d.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://e.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://f.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://g.hiphotos.baidu.com" />
)

doc := ComObjCreate("HtmlFile")
doc.Write(src), doc.Close()

urls := []
Loop, % doc.all.tags("link").Length
    urls.Push( doc.all.tags("link")[A_Index-1].href ) ; 因为 DOM 的数组是 0 开头的,所以要减 1
    
MsgBox, % "网址数量:" urls.MaxIndex() "`n第一条网址:" urls.1
Return

Re: 【已解决】求助 一个 正则表达式

Posted: 01 Jun 2015, 07:30
by aamii
tmplinshi wrote:另一个方法是用 DOM

Code: Select all

src =
(
<link rel='dns-prefetch' href="http://imgt6.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt7.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt8.bdstatic.com" />
<link rel='dns-prefetch' href="http://imgt9.bdstatic.com" />
<link rel='dns-prefetch' href="http://a.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://b.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://c.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://d.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://e.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://f.hiphotos.baidu.com" />
<link rel='dns-prefetch' href="http://g.hiphotos.baidu.com" />
)

doc := ComObjCreate("HtmlFile")
doc.Write(src), doc.Close()

urls := []
Loop, % doc.all.tags("link").Length
    urls.Push( doc.all.tags("link")[A_Index-1].href ) ; 因为 DOM 的数组是 0 开头的,所以要减 1
    
MsgBox, % "网址数量:" urls.MaxIndex() "`n第一条网址:" urls.1
Return
还可以这么用啊,真不错