perl正規表示式捕獲,perl如何用正規表示式捕獲內容

2022-05-08 08:19:42 字數 2747 閱讀 5042

1樓:匿名使用者

說實話,這個我也研究半天,雖然最終搞明白了,但這種肯定真正程式設計時是肯定不提倡使用的,正則非常巧妙,幾個符號缺一不可。

首先搞懂順序問題:

從perlre文件裡面關於capture buffers的描述可以看出:capture buffers are numbered from left to right,編號是從左到右的。也就是說,對於你這個表示式,最外面是$1, 中間是$2, 最裡面是$3。

但下面還有一句:

but inside this construct the numbering is restarted for each branch.

編號會重新開始,也就是以前的編號裡的內容就被替換掉了。

# before  ---------------branch-reset----------- after

/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x

# 1            2         2  3        2     3     4

然後程式解析正則,先看到的s...ly,於是找到了[softly],此為$3,然後要求0或多個空格,正好後面有一個空格,所以解析到了[softly ],此為$2。這時候關鍵來了,後面跟一個單純的*。

都知道*表示0或多次,但一般前面有個引導字元,表示你要0或多個什麼字母,但這裡前面沒有字母,有的是一串的表示式,所以程式發現,我需要0或多個這種結構(s...ly)\s*的串,所以只能接著找看後來有沒有這樣的串。

所以程式接著找到[slowly],$3的內容被替換為這個,隨後同樣的$2被替換為[slowly ],然後再找,直到第4次,$3被替換為[subtly],$2同樣是[subtly],查詢結束,程式說,你要求0到多個(s...ly)\s*結構的串,我一共給你找到了4個這樣的串,分別是:[softly ][slowly ][surely ][subtly],那麼$1就是幾個這樣串的組合,就是完整的[softly slowly surely subtly]

說實話,我花了10分鐘搞明白這個,自己都感覺挺無聊的,有時候不如折騰點有用的東西。。。。

2樓:匿名使用者

具體解釋如下:

() -- 捕獲

. -- 匹配任意字元

\s -- 匹配空格

* -- 大於等於0次匹配

---------

「softly slowly surely subtly」 -- 這4個字串都有一個共同的特點,就是字元s和ly之間都有3個字元,所以可以有三個"."來進行匹配, 這樣可以得知列印的結果應該為前三個字串

perl如何用正規表示式捕獲內容

3樓:

(?<=,)\d+%

只會返回 xx%

若還不能解決,請追問,我繼續幫你

perl正規表示式中的模式分組疑問

4樓:匿名使用者

這是perl裡模式分組的概念,如果不是很懂,可以找下小駱駝版的看下,裡面說的很清楚。

對於perl:

在正規表示式中,小括號()的作用是對字串分組,其出現的地方一般會觸發正規表示式引擎捕獲匹配到的字串,然後捕獲組會的把匹配小括號中模式的字串儲存到相應的地方。第一個()內所找到的字串儲存到$1和\1變數;第n個()內所找到的字串儲存到$n和\n變數中。

$x與\x的區別是:\x反向引用的是模式匹配期間得到的結果,即只有在模式匹配期間能使用;

而$x則是模式匹配結束後對得到的捕獲內容的索引,即到下次出現正確匹配前,這個變數的內容會一直存在

對於你的例子」/(.)\1/

是 . 匹配一個字元,然後用()括起來,是把這個匹配的字元放在捕獲變數1中,這樣就可以用\1或$1來引用這個匹配的字元。所以/(.

)\1/就是匹配二個連續的且相同的字元,就是你說的,再重複一次的意思。

5樓:

理解是正確的. \1 就是前面 ( ) 裡的東西重覆了一次.

留意, 必須是 () , 不能是 [ ].

print "ok" if "12312" =~ /(123)\1/; # 這個不行

print "ok" if "123123" =~ /(123)\1/; # ok

'.' 就是匹配任何字元的意思. 包括數字, 空格, 符號, 或者你看不見的 ascii 字元, 例如 null

6樓:匿名使用者

perl正則是 nfa 引擎,看表示式就行了

7樓:匿名使用者

\1看上去是重複前面的內容,其實\1是一個變數捕獲,第一個匹配到得內容會存入變數$1裡

perl 里正規表示式取值

8樓:匿名使用者

my $aim = (split /\// , $string)[-1];

9樓:匿名使用者

my $str = '//abc/bb/cc';

if ($str =~ m|(.*)/(.+?)$|)

perl怎麼用正規表示式處理這個問題?

求教perl正規表示式匹配。

10樓:在網路中迷失

因為*號是匹配0次或多次 永遠不會匹配失敗

你這邊又是全域性匹配的,所以他的每個位置都會匹配成功

正規表示式問題,正規表示式問題(需要通用)

這樣不知道 是不是你想要的 首先你給的xml是不規範的。硬要匹配的話,可以試試下面的 你要的字串在group 1 中 性和閏年等問題.對於日期的有效範圍,不同的應用場景會有所不同。msdn中定義的datetime物件的有效範圍是 0001 01 01 00 00 00到9999 12 31 23 5...

正規表示式怎麼匹配這樣的文字,正規表示式怎麼匹配標點符號

正則表達 括號中的捕獲內容就是 正規表示式怎麼匹配標點符號?如何用正規表示式匹配漢字?先用靚湯或正則找到這個節點,再用上面的字元組匹配。假設這個節點只有一個,用法如下 import reimport requests as reqfrom bs4 import beautifulsoupurl ht...

易語言正規表示式的中的正規表示式文字怎麼取的

易語言不支援逆向斷言,所以你只能使用分組。取group 2 即可,具體易語言怎麼取正則的分組請自己參考易語言的api 上面文字,中兩個人對話 共同開始結束特徵 開始 結束 換行 給出表示式 就這樣,詳細的加q 版本2.支援庫 duregex 程式集 視窗程zhi序集1 子程式 按鈕1 被單擊 區域性...