0

METAR 天気予報 ( http://weather.noaa.gov/pub/data/observations/metar/cycles/からダウンロード) から風の説明をキャプチャし、そのブロックから風の成分を取得しようとしています。一致します。正規表現は@"^([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)".

キャプチャされた一致を配列に列挙するために PDRegex ライブラリを使用しています。(PDRegex ライブラリはhttps://github.com/carlbrown/RegexOnN ​​SString/blob/master/RegexOnN​​SString/NSString%2BPDRegex.m にあります)

これらは私のコードで該当する行です:

word = @"16008KT"; //test block
NSArray *matches = [word stringsByExtractingGroupsUsingRegexPattern:@"^([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)"];

( PDRegexstringsByExtractingGroupsUsingRegexPatternメソッド) が呼び出されて一致すると、 の 62 行目でクラッシュしNSString+PDRegexます。これは、アプリがクラッシュする PDRegex の行です。

NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];

そして、これはクラッシュレポートです:

キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: '-[__NSCFString substringWithRange:]: 範囲またはインデックスが範囲外です'

4

3 に答える 3

2

問題のある行の上に次のチェックを追加して、問題を解決しました。

if ([result rangeAtIndex:i].length!=0)

この問題は、括弧内のすべての文字列部分が一致したわけではなく、一致しない範囲が元の「単語」文字列の範囲外であったために発生しました。

于 2013-02-24T16:02:12.470 に答える
1

おそらくアンカー ( ^) が原因です。行の先頭にある場合にのみ、パターンに一致するように指示しています。(または、複数行モードでない場合は文字列全体の先頭にありますが、複数行モードがデフォルトのようです。)

たまたま風のように見える長い文字列の一部ではなく、実際の風の説明と一致していることを確認したい場合(例: foo12307KTbar)、単語境界で囲むことができます。

\b([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)\b

Objective-C の文字列リテラル形式では、次のようになると思います。

@"\\b([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)\\b"
于 2013-02-24T07:13:40.520 に答える
1

out インデックスの範囲を呼び出しているようですので、NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];のインデックスiを確認してください。定義されています

于 2013-02-24T07:06:14.720 に答える