iOS正規表現の使用
3275 ワード
ターゲット:次の問題を解きます.
私たちが使っている微博では@他の人に行くことができますが、私たちが使っている間に文字列を処理する必要があります.具体的な要求は以下の通りである.
最初はアルファベットや数字で始まり、@記号を追加します.真ん中には何でも反スラッシュがありますが、反スラッシュのあるアルファベットはすべて自分で処理し、スペースや最終行で終わります.スペースの前にスラッシュがある場合はスペースとして扱わず、必要なスペースが見つかるまで下に検索します.
コード解析で使用される知識点:
1. 文字列処理、RangeOfString:withOption正規表現で処理
2. 論理的に、必要な@記号を見つけてから、その後のスペースを見つけます.
3. すべてのスラッシュを@'''で置き換え、stringByReplaを使用することで
具体的なパッケージ方法は以下の通りです.
すべてのスラッシュを処理
入力された文字列は、使用時に自動的にエスケープされ、入力された文字列が逆スラッシュであれば、OCで転送されたときに2つの逆スラッシュに変換されることがわかります.すべての関連操作もそうです.
使用する知識点:
/*
「複数文字」に一致する式をカスタマイズ
//\w英語と数字の2種類を処理して他の文字にぶつかると1つの終点として処理することができて、アルファベットあるいは数字あるいは下線あるいは漢字に一致します
. 改行以外の任意の文字を一致させることができます
s任意の空白文字に一致
d一致数字
b単語の開始または終了に一致する
[]を使用すると、任意の文字に一致する一連の文字が含まれます.
[^]は一連の文字を含み、そのうちの文字外の任意の文字にしか一致しない.同様に、そのうちのいずれかに一致することができるが、1つだけで、複数ではない.
[]そのものには「or」関係が隠されており、[]で「|」を使って「or」を表す関係は正しくありません.
例:
[ab 5@]:「a」または「b」または「5」または「@」に一致する
[^abc]:a、b、c以外の任意の文字に一致
[f-k]:「f」~「k」の間の任意のアルファベットに一致する
[^A-F 0-3]:「A」~「F」,「0」~「3」以外のいずれかの文字にマッチ
修飾一致回数の特殊記号
{n}:式をn回繰り返す
{m,n}:式は少なくともm回、最大n回繰り返される
{m,}:式は少なくともm回繰り返される
?:式を0回または1回マッチングし、{0,1}に相当します.
+:式は{1,}に相当する少なくとも1回表示されます.
*:式は、{0,}に相当する任意の回数で表示されません.
抽象的な意味を表す特殊な記号
^:文字列の最初の場所と一致し、文字列に一致しません.
$:文字列の終わりに一致し、文字列に一致しません.
b:単語の境界、すなわち単語とスペースの間の位置を一致させ、文字を一致させない
():グループを表します.このグループは同時に処理され、グループの要素が加算されます.
*/
私たちが使っている微博では@他の人に行くことができますが、私たちが使っている間に文字列を処理する必要があります.具体的な要求は以下の通りである.
最初はアルファベットや数字で始まり、@記号を追加します.真ん中には何でも反スラッシュがありますが、反スラッシュのあるアルファベットはすべて自分で処理し、スペースや最終行で終わります.スペースの前にスラッシュがある場合はスペースとして扱わず、必要なスペースが見つかるまで下に検索します.
コード解析で使用される知識点:
1. 文字列処理、RangeOfString:withOption正規表現で処理
2. 論理的に、必要な@記号を見つけてから、その後のスペースを見つけます.
3. すべてのスラッシュを@'''で置き換え、stringByReplaを使用することで
具体的なパッケージ方法は以下の通りです.
- (void)dealWithString:(NSString *)str
{
NSString *regexStringForHead = @"\\w@";
NSString *regexStringForFooter = @"(\\w\\s)";
NSRange rangeHead = [str rangeOfString:regexStringForHead options:NSRegularExpressionSearch];
NSInteger headIndex = 0;
NSInteger footerIndex = 0;
if (rangeHead.location != NSNotFound) {
headIndex = rangeHead.location + rangeHead.length;
NSLog(@"headIndex %d",headIndex);
NSString *strForFooter = [str substringFromIndex:rangeHead.length + rangeHead.location]; // range ,
NSRange rangeFooter = [strForFooter rangeOfString:regexStringForFooter options:NSRegularExpressionSearch];
if (rangeFooter.location != NSNotFound) {
footerIndex = rangeFooter.location + rangeFooter.length;
NSLog(@"FooterIndex %d",footerIndex);
NSRange rangeTemp = NSMakeRange(headIndex, footerIndex-1); //
NSString *tempStr = [str substringWithRange:rangeTemp];
[self.dataArr addObject:tempStr];
str = [str substringFromIndex:rangeTemp.length + rangeTemp.location];
[self dealWithString:str];
} else{ //
str = [str substringFromIndex:headIndex];
[self.dataArr addObject:str];
}
}
}
すべてのスラッシュを処理
for (int i = 0; i
入力された文字列は、使用時に自動的にエスケープされ、入力された文字列が逆スラッシュであれば、OCで転送されたときに2つの逆スラッシュに変換されることがわかります.すべての関連操作もそうです.
使用する知識点:
/*
「複数文字」に一致する式をカスタマイズ
//\w英語と数字の2種類を処理して他の文字にぶつかると1つの終点として処理することができて、アルファベットあるいは数字あるいは下線あるいは漢字に一致します
. 改行以外の任意の文字を一致させることができます
s任意の空白文字に一致
d一致数字
b単語の開始または終了に一致する
[]を使用すると、任意の文字に一致する一連の文字が含まれます.
[^]は一連の文字を含み、そのうちの文字外の任意の文字にしか一致しない.同様に、そのうちのいずれかに一致することができるが、1つだけで、複数ではない.
[]そのものには「or」関係が隠されており、[]で「|」を使って「or」を表す関係は正しくありません.
例:
[ab 5@]:「a」または「b」または「5」または「@」に一致する
[^abc]:a、b、c以外の任意の文字に一致
[f-k]:「f」~「k」の間の任意のアルファベットに一致する
[^A-F 0-3]:「A」~「F」,「0」~「3」以外のいずれかの文字にマッチ
修飾一致回数の特殊記号
{n}:式をn回繰り返す
{m,n}:式は少なくともm回、最大n回繰り返される
{m,}:式は少なくともm回繰り返される
?:式を0回または1回マッチングし、{0,1}に相当します.
+:式は{1,}に相当する少なくとも1回表示されます.
*:式は、{0,}に相当する任意の回数で表示されません.
抽象的な意味を表す特殊な記号
^:文字列の最初の場所と一致し、文字列に一致しません.
$:文字列の終わりに一致し、文字列に一致しません.
b:単語の境界、すなわち単語とスペースの間の位置を一致させ、文字を一致させない
():グループを表します.このグループは同時に処理され、グループの要素が加算されます.
*/