0

正規表現を使用して、レシピの材料を調理する際の測定値、準備情報、およびその他の形容詞を除外しようとしています。次の結果が必要です。

与えられたとき:

1 cup (3oz) sliced carrots, cut lengthwise

が欲しいです:

carrots

Macアプリ「Patterns」を使用して正規表現を処理すると、次の式が希望どおりに機能します。

(?<word>[a-zA-Z0-9]+)(?<! cut|cup|sliced|lengthwise|[(0-9)+(oz)?])\b

ただし、次のコードでこれを使用すると、一致するものはありません。「matches」配列は空です。

NSString *phrase = [NSString stringWithString:@"1 cup (3oz) sliced carrots, cut lengthwise"];

NSRegularExpression *nameExpression = [NSRegularExpression regularExpressionWithPattern:@"(?<word>[a-zA-Z0-9]+)(?<! cut|cup|sliced|lengthwise|[(0-9)+(oz)?])\b" options:NSRegularExpressionSearch error:nil];

NSArray *matches = [nameExpression matchesInString:phrase
                                           options:0
                                             range:NSMakeRange(0, [phrase length])];

目標言語としてObj-Cを使用するように練習アプリを設定しています。一致しないのはなぜですか?

?<word>更新:は無関係であり、問​​題は?<!文字のシーケンスにあることを発見しました。繰り返しますが、式

([a-zA-Z0-9]+)(?<! cut|cup|sliced|lengthwise|[(0-9)+(oz)?])\b

私のobjective-cregexテスターでは機能しますが、私のコードでは機能しません。

4

2 に答える 2

1

2つのこと:

(?<word>[a-zA-Z0-9]+)(?<! cut|cup|sliced|lengthwise|[(0-9)+(oz)?])\b 
 ^^^^^^^                                            ^^^^^^^^^^^^^ 
 1                                                  2             
  1. NSRegularExpressionクラスリファレンスでは、「名前付きキャプチャグループ」については言及されていません。これがこれです。おそらくそれらはサポートされていません。

  2. 現在、これは文字で構成される任意の文字列と一致します0123456789oz+()?。私はそれがあなたの意図したことではないと思います。おそらく、外側の角かっこを削除して、それらで囲み0-9ます。

これにより、次のことが可能になります。

([a-zA-Z0-9]+)(?<! cut|cup|sliced|lengthwise|[0-9]+(oz)?)\b

編集:

無制限のルックビハインドアサーションを持つことはできません。代わりに先読みを使用してください(そして私はあなたの表現を少し改善しています):

\b(?!(?:cut|cup|sliced|lengthwise|[0-9]+(?:oz)?)\b)([a-zA-Z0-9]+)

これがRubularのデモです。

于 2012-09-25T17:30:23.473 に答える