2

こんにちは私はしばらくの間これをだましていて、助けを求める時が来たと思っていました...

奇抜な文字列から5文字より長いすべての大文字の文字(非数値または特殊文字のフレーズ)シーケンスを返そうとしています。

だから:

02/02/12-02:45 PM(CKI)-DISC RSPNS SRVD 01/31/12-PRINTED DISCOVERY:spina.bp.doc(DGB)   
01/27/12-ON CAL-FILED NOTICE OF TRIAL(JCX) 01/24/12-SENT OUR DEMANDS(Auto-Gen) 01/23/12-
02:31  PM-File pulled and given to KG for responses.(JLS) 01/20/12(PC)-rcd df jmt af

のリストを返したいのですが

DISC RSPNS SRVD

印刷された発見

審理の提出通知

私たちの要求を送った

私は次のバリエーションでだまされてきました:

[A-Z][A-Z\d]+ 
[A-Z][A-Z\d]+ [A-Z][A-Z\d]+"

ただし、これは正規表現に関する私の知識の範囲から少し外れています。

編集

私はしようとしています

string[] capWords = Regex.Split(d.caption, @"[A-Z\s]{5,}");
foreach (var u in capWords) { Console.WriteLine(u); }

出力:

02/02 / 12-02:45 PM(CKI)-01/31 / 12-

:spina.bp.doc(DGB)01/27 / 12-

(JCX)01/24 / 12-(Auto-Gen)01/23/12-02:31 PM-ファイルがプルされ、応答のためにKGに渡されました。(JLS)01/20/12(PC)-rcd df jmt af

Kendallの提案出力:

02/02 / 12-02:45 PM(CKI)-01/31 / 12-

:spina.bp.doc(DGB)01/27 / 12-

(JCX)01/24 / 12-(Auto-Gen)01/23/12-02:31 PM-ファイルがプルされ、応答のためにKGに渡されました。(JLS)01/20/12(PC)-rcd df jmt af

4

3 に答える 3

3

どうぞ:

[AZ \ s] {5、}

テストされ、リストしたアイテムのみが返されます。

説明:

[A-Z\s]-大文字とスペースのみに一致します

{5,}-一致する文字数は5文字以上で、文字数に上限はありません。

コード:

MatchCollection matches = Regex.Matches(d.caption, @"[A-Z\s]{5,}");
foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}
于 2012-05-04T17:11:03.410 に答える
2

これを試して。先頭/末尾のスペースを削除することを想定しています。

[A-Z][A-Z ]{4,}[A-Z]

また、Regex.Splitは必要ないと思います。

var matches = Regex.Matches(d.caption, @"[A-Z][A-Z ]{4,}[A-Z]");
foreach (var match in matches)
{
    Console.WriteLine(match.Value);
}

次のこともできます。

var matches = Regex.Matches(d.caption, @"[A-Z][A-Z ]{4,}[A-Z]")
                   .OfType<Match>()
                   .Select(m => m.Value);
foreach (string match in matches)
{
    Console.WriteLine(match);
}
于 2012-05-04T17:18:23.460 に答える
0

あなたは単一の正規表現ソリューションを求めていましたが、与えられた基準と例を使用して、文字列をカウントし、特定の文字タイプ(スペース)を無視する単一の正規表現を取得できませんでした。失敗はONCALのような文字グループで発生しました。これは一致として失敗するはずですが、合計文字数のために合格していました。

したがって、大文字が5つしかない文字グループが存在することを確認するには、2つの正規表現を使用する必要がありました。これは少し面倒で、文字列メソッドを使用すると、これをより速く、より簡単に行うことができました。

ソーステキストのフォーマットに関する確実性をリストできる場合、これは単一の正規表現で機能する可能性があります。たとえば、探している文字グループの前に常にダッシュがあり、ダッシュではない句読点で終わっているか、数字で終わっていることがわかっている場合です。

午後5時(--- FAIL(ダッシュが前に付いていない)

(CKI)--- FAIL(ダッシュが前に付いていない)

-DISC RSPNS SRVD0---合格

-印刷された発見:---合格

-ON CAL- --- FAIL(ダッシュで終了)

-審理の提出通知(---合格

-私たちの要求を送信しました(---合格

それを除いて、2つの方法のいずれかで結果を取得するコードを含めました。私は2番目が好きです。

        String source1 = "02/02/12-02:45 PM(CKI)-DISC RSPNS SRVD 01/31/12-PRINTED
 DISCOVERY:spina.bp.doc(DGB) 01/27/12-ON CAL-FILED NOTICE OF TRIAL(JCX) 01/24/12-SENT
 OUR DEMANDS(Auto-Gen) 01/23/12- 02:31 PM-File pulled and given to KG for responses.(JLS) 01/20/12(PC)-rcd df jmt af ";

    String assembledString;

    public void bumbleBeeTunaTest()
    {
        String strippedString = source1.Replace(" ", "");

        String regString1 = ""; 
        String regString2 = @"([A-Z]{6,})";
        String matchHold1,matchHold1First,matchHold1Last,matchHold1Middle;
        Int32 matchHold1Len;


        Regex regExTwo = new Regex(regString2);

        MatchCollection regMatch2 = regExTwo.Matches(strippedString);


        foreach (Match match2 in regMatch2)
        {
            matchHold1 = match2.Groups[1].Value;
            matchHold1Len = matchHold1.Length;
            matchHold1First = matchHold1.Substring(0,1);
            matchHold1Last = matchHold1.Substring(matchHold1Len - 1,1);
            matchHold1Middle = matchHold1.Substring(1, matchHold1Len - 2);


            Debug.Print("Stripped String Matches - " + matchHold1);


            regString1 = @"(" + matchHold1First + "[" + matchHold1Middle+  " ]{" + (matchHold1Len -1) + ",}" + matchHold1Last + ")";

            Regex regExOne = new Regex(regString1);

            MatchCollection regMatch1 = regExOne.Matches(source1);

            regMatch1 = regExOne.Matches(source1);



            foreach (Match match1 in regMatch1)
            {

                Debug.Print("Re-Assembled Matches :" + match1.Groups[1].Value.ToString());
            }

        }

        // Does the same thing as the above.  Just a little simpler.
        for (int i = 0; i < source1.Length; i++)
        {
            if (char.IsUpper(source1[i]) | char.IsWhiteSpace(source1[i]))
            {
                assembledString += source1[i];
            }
            else
            {
                if (!string.IsNullOrEmpty(assembledString))
                {
                    if (assembledString.Count(char.IsUpper) > 5)
                    {
                        Debug.Print("Non Reg Ex Version "  + assembledString);
                    }
                    assembledString = "";
                }
            }
        }
    }

出力は次のようになります。

Stripped String Matches - DISCRSPNSSRVD
Re-Assembled Matches :DISC RSPNS SRVD
Stripped String Matches - PRINTEDDISCOVERY
Re-Assembled Matches :PRINTED DISCOVERY
Stripped String Matches - FILEDNOTICEOFTRIAL
Re-Assembled Matches :FILED NOTICE OF TRIAL
Stripped String Matches - SENTOURDEMANDS
Re-Assembled Matches :SENT OUR DEMANDS
Non Reg Ex Version DISC RSPNS SRVD 
Non Reg Ex Version PRINTED DISCOVERY
Non Reg Ex Version FILED NOTICE OF TRIAL
Non Reg Ex Version SENT OUR DEMANDS
于 2012-05-05T15:54:24.543 に答える