[#42243] コミュニティと宗教の分離について — Beyond <beyond@...>

14 messages 2006/05/21

[#42267] メニューのループについて — リックス <rubyer4649@...>

りっくすです

21 messages 2006/05/27

[#42301] Re: メニューのループについて — "conundrum /" <conundrum@...>

conundrumです。

11 messages 2006/05/28

[ruby-list:42232] Re: 正規表現のマッチングがフリーズしてしまうコード

From: "NARUSE, Yui" <naruse@...>
Date: 2006-05-20 11:42:30 UTC
List: ruby-list #42232
成瀬です。

今更ではありますが、Ruby1.9の鬼車だとこんなこともできるんですね、と。

nested_parentheses = /(?<pare>\(([^\(\)]+|\g<pare>)*\))/

これだとちゃんとマッチします。
もっとも、閉じる方向で括弧が余計な場合は大丈夫ですが、
開き括弧が余計にある場合は固まりますが。

名前付き捕獲式集合を定義のみ行う文法があると、
再帰的な正規表現を??{}のようにコードを埋め込むことなく
書くことができそうです。

もっとも、
nested_parentheses = /[^\w\W]
  (?<text>   [^\(\)]+)
  (?<pare>   \( (\g<text> | \g<pare>)* \)  )|
  \g<pare>/x
というように、工夫すれば今でも書けはします。


なお、元の正規表現ですが、
途中、[^\(\)]*[^\(\)]*という部分があるのと、
末尾の\s+\Zが余計かと思います。
rx_five_level_nested_parentheses =
  %r!(
      \(
	[^\(\)]*
	(
	 \(
	   [^\(\)]*
	   (
	    \(
	      [^\(\)]*
	      (
	       \(
		 [^\(\)]*
		 (
		  \(
		    [^\(\)]*
		    \)
		  [^\(\)]*
		 )*
		 [^\(\)]*
		 \)
	       [^\(\)]*
	      )*
	      [^\(\)]*
	      \)
	    [^\(\)]*
	   )*
	   [^\(\)]*
	   \)
	 [^\(\)]*
	)*
	[^\(\)]*
	\)
     )!mx
が正しいかと。
これも開き括弧が余計にある場合は固まりますけども。

-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread