0

これらの種類の文字列の単一行番号をSingleLineNrsという名前のリストに入れたいと思います。

\%(\%>1l.\%<4l\|\%>5l.\%<7l\|\%>9l.\%<15l\|\|\%>15l.\%<17l\|\%>17l.\%<19l\|\%>24l.\%<29l\|\%>31l.\%<33l\|\%>33l.\%<35l\)

SingleLineNrsは[2,3,6,10,11,12,13,14,16,18,25,26,27,28,32,34]

>しかし、と<記号があるため、これらの文字列を分割する方法がわかりません。
問題は、文字列selfの数字ではなく、>との間の数字が必要なことです。<

4

2 に答える 2

1

次のような正規表現を使用して、入力文字列を分割できます。

>(\d+)\D+(\d+)

2つのキャプチャグループがあります。

  • グループ1:作成する整数シーケンスの下限。
  • グループ2:作成する整数シーケンスの上限。

次に、すべての正規表現の一致をループして、一致によって得られる範囲から数字のシーケンスを生成します。

アクセスできるコード環境がわかりません。これが、指定したサンプル入力文字列から必要な出力を生成するC#関数です。

private static string DecodeSequence(string encodedSequence)
{
    const string SEPARATOR = ",";
    const int GRP_LBOUND = 1, GRP_UBOUND = 2;
    Regex boundPairPattern = new Regex(@">(\d+)\D+(\d+)");
    Match matchBoundPair = boundPairPattern.Match(encodedSequence);

    var decodedSequence = new StringBuilder();
    while (matchBoundPair.Success)
    {
        int lBound = Convert.ToInt32(matchBoundPair.Groups[GRP_LBOUND].Value);
        int uBound = Convert.ToInt32(matchBoundPair.Groups[GRP_UBOUND].Value);
        for (int i = lBound + 1; i < uBound; ++i)
        {
            decodedSequence.Append(i).Append(SEPARATOR);
        }
        matchBoundPair = matchBoundPair.NextMatch();
    }
    if (decodedSequence.Length > 0) decodedSequence.Length -= SEPARATOR.Length;
    return String.Format("[{0}]", decodedSequence);
}
于 2012-12-05T13:11:06.740 に答える
-1

データを分析すると、構造がわかります。

  1. で区切られた範囲\|
  2. で区切られた下限と上限.
  3. バウンドは、先頭にある興味のないもの(\%)、印章(</ >)、数字、そして最後にある興味のないもので構成されます
  4. 印章に応じて、最初/最後の行番号を取得するには、番号を増減する必要があります

データを段階的に処理します。split()各ステップは、、、、またはその他matchstr()matchlist()プリミティブ操作の単純な呼び出しです。

たとえば、最初のステップは

:echo split('\%(\%>1l.\%<4l\|\%>5l.\%<7l\|\%>9l.\%<15l\|\|\%>15l.\%<17l\|\%>17l.\%<19l\|\%>24l.\%<29l\|\%>31l.\%<33l\|\%>33l.\%<35l\)', '\\|')
于 2012-12-06T07:39:52.097 に答える