1

コメント付きのキーと値のペアを取得するには、iOS の *.strings ファイルを解析する必要があります。例えば:

/* comment */
"key" = "value";

行を見つけてその有効性を確認したら (私はすでにそれを行うことができました)、その行とその直前のコメントをキャプチャする必要があります。

難点は次のとおりです。

  • すべての行の前にコメントがあるわけではないため、/* で始まりセミコロンで終わるブロック全体をキャプチャすることはできません。
  • 以下の行にコメントがある可能性がありますが、この行は無効な形式である可能性があるため、コメントとともにスキップする必要があります。

そのため、キーと値の行を検出し、コメントが存在する場合はそれを確認する必要があります。

正規表現は逆行できますか?

PS私は.NET Frameworkを使用して解析しています:

string[] lines = File.ReadAllLines(fileName);
foreach (string line in lines)
{
    string[] kvp = Regex.Split(line, "\"\\s+?=\\s+?\"");
    if (kvp.Length == 2 && kvp[0].StartsWith("\"") && kvp[1].EndsWith("\";"))
    {
        DataRow row = table.NewRow();
        row["name"] = kvp[0].TrimStart('"');
        row["text"] = kvp[1].Substring(0, kvp[1].Length - 2);
        row["fileId"] = fileId;
        table.Rows.Add(row);
    }
}
4

3 に答える 3

3

これらすべてを単一の正規表現で実行できます。

Match match = null;
match = Regex.Match(subject, 
    @"(?<=           # Look behind to make sure that there is a comment before:
    (?:              # Try to match...
     /\*             # /*
     (?<comment>     # Capture the comment in the group 'comment'
      (?:            # Match...
       (?!\*/)       # (as long as it's not '*/')
       .             # any character.
      )*             # Repeat as needed.
     )               # End of group 'comment'
     \*/             # Match */
    )?               # Make the whlo comment optional
     \s*             # Match whitespace, including newlines
    )                # End of lookbehind assertion
    ^                # Match the start of the line
    ""               # Match a quote
    (?<name>[^""]*)  # Capture any number of non-quote characters into group 'name'
    ""\s*=\s*""      # Match quote - equals - quote, with optional whitespace
    (?<value>[^""]*) # Capture any number of non-quote characters into group 'text'
    "";              # Match the closing quote and semicolon", 
    RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
row["name"] = match.Groups["name"];
row["text"] = match.Groups["text"];
row["comment"] = match.Groups["comment"];
于 2012-12-21T12:55:55.107 に答える
0

のようなことをしたとしても、正規表現は決して逆戻りしません.+$。ただし、逆方向に動作するように見せることはできます。ただし、これはこのタスクには実際には必要ありません。

次の正規表現を使用できます。

/^(?<comment>(?:\/\*(?:(?!\*\/).)*\*\/)?\s*)(?<key>"(?:\\.|[^"])+")\s*=\s*(?<value>"(?:\\.|[^"])+")\s*;/gms

(.netで区切り文字とグローバルフラグが必要かどうかわからない)

したがって、基本的に、最初の後方参照はコメントを保持します。2 番目はキーを保持し、3 番目は値を保持します。キー/値にまったく興味がない場合は、最後の2つの後方参照を1つにマージすることにより、正規表現をさらに簡素化できます。

これで、必要なデータがすべて揃いました。それに応じて交換するだけです。最初の後方参照にnull値が含まれている場合、その行の上にコメントがないことがわかります。

デモ+説明: http://regex101.com/r/xN1uQ4

不明な点があれば質問してください。

于 2012-12-21T12:59:00.603 に答える