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

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: 【已解决】求助 一个 正则表达式

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

Post by aamii » 01 Jun 2015, 07:30

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: 【已解决】求助 一个 正则表达式

Post by youwantme » 01 Jun 2015, 05:45

感谢兄台耐心解答!
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: 【已解决】求助 一个 正则表达式

Post by tmplinshi » 01 Jun 2015, 04:23

另一个方法是用 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: 【已解决】求助 一个 正则表达式

Post by tmplinshi » 01 Jun 2015, 04:14

指定 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: 【已解决】求助 一个 正则表达式

Post by youwantme » 01 Jun 2015, 02:17

再次求教 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: 【已解决】求助 一个 正则表达式

Post by youwantme » 30 May 2015, 01:00

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

Code: Select all

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

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

Post by tmplinshi » 29 May 2015, 04:40

[] 这两个字符需要用反斜杠“\”进行转义。

Code: Select all

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

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

Post by youwantme » 29 May 2015, 03:38

再求教 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: 【已解决】求助 一个 正则表达式

Post by youwantme » 28 May 2015, 22:22

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

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

Post by tmplinshi » 28 May 2015, 21:38

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

Re: 求助 一个 正则表达式

Post by youwantme » 28 May 2015, 21:35

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: 求助 一个 正则表达式

Post by youwantme » 28 May 2015, 02:28

兄太牛了,真心好用,哈哈。谢啦!
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: 求助 一个 正则表达式

Post by tmplinshi » 28 May 2015, 02:19

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

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

Post by youwantme » 27 May 2015, 21:10

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

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

Code: Select all

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

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

正则纯小白,谢谢啦!

Top