dポイントプレゼントキャンペーン実施中!

Objective-Cの正規表現について質問です。
表計算ソフトなどで使う数式を検索対象文字列として、「引数内に関数が使用されていない関数」をマッチさせたいと考えています。
どの様な正規表現であれば良いかご教示頂けますでしょうか。

以下に具体例を示します。
--------------------------------------------
■検索対象文字列
=SUM(A1:A3;SUM(B1:B3);ROUND(IF(C2>10;1.234;0);2))
※数式の内容は適当です

■マッチさせたい文字列
SUM(B1:B3)
IF(C2>10;1.234;0)

■補足説明
1) 検索対象文字列の最初のSUM関数の引数内には別のSUM関数等が使用されているので除外。
2) 2番目のSUM関数の引数内には関数が使用されていないのでマッチさせる。
3) ROUND関数の引数内にはIF関数が使用されているので除外。
4) IF関数の引数内には関数が使用されていないのでマッチさせる。

■その他条件
1) 関数名は2~5文字の英字とする
 例.SUM(),IF(),ROUND()など
2) 正規表現内で関数名の直書きはしない
3) セル参照式のアルファベットは必ず1文字とする
 例.A1やZ30等。AB1やBZ30等は無い。
--------------------------------------------

関数の引数内に「英字2~5文字がある場合は除外する」と言う意味で、以下の様な正規表現を組んだのですが上手くいきませんでした。
[A-Za-z]{2,5}\([^([A-Za-z]{2,5})]*\)

以下の様に関数名を直書きすれば理想の結果となるのですが…
[A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\)

あくまで、いろいろな関数名に可変で対応したいと考えています。
どの様な正規表現であれば良いでしょうか。
お知恵を貸して頂ければと思います。
宜しくお願い致します。

A 回答 (2件)

あ, 念のためですが, 「本来の正規表現では不可能」というのは, 主にかっこの問題です. つまり, 正規表現だと


IF((A1+B3)/(C2+5) > 3; 7; 1)
とかいうばあいに
「IF((A1+B3)」
だけを取り出しちゃったりするんですね.

逆に言えば, 「括弧は関数のためだけにある」というならできるような気がします.

この回答への補足

正規表現を使って一発で検索する事を断念しました。

関数の「(」から、「(」と「)」の数を数えていけば関数の「)」を判別できそうです。
そして、関数の「(」から「)」までの間に関数が使われていないかチェックする。
この繰り返しで「引数で関数が使われていない関数」を見つけ出す事にしました。

泥臭いのですが今のところ他に思い付かないのでコレで行こうと思います。

ご回答ありがとうございました。

補足日時:2013/01/14 19:06
    • good
    • 0
この回答へのお礼

なるほど「本来の正規表現では不可能」はそう言う意味だったのですね。
確かに「括弧は関数のためだけにある」と言うルールがあれば出来そうですね。
こんな感じでしょうか。
[A-Za-z]{2,5}\([^\(\)]*\)

しかし括弧は必要なのです…
再回答ありがとうございます。

もう少し悩んでみます。

お礼日時:2013/01/11 18:55

まず, この処理は「本来の正規表現」では原理的に不可能です. ただし, 今日では「正規表現」と言っていながらこれができたりするものもあるので, 厳密にはあなたが使っている「正規表現」に依存する部分もあります.



ところで,
[A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\)
で本当にいいんでしょうか? 例えば
=SUM(A1:A3;SUM(F1:F3);ROUND(IF(D2>10;1.234;0);2))
とかで困りそうな気がするんですが.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご指摘の通り
[A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\)
ではダメでした。
例題の対象文字列で、たまたま上手く出来ていただけでした。
当方の確認不足です。すみません。

不可能だと言う事が分かっただけでも助かりました。別の方法を検討してみます。
ありがとうございました。

お礼日時:2013/01/11 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!