1

正規表現のヘルプが必要です。C# を使用します。

括弧内の単語のグループ (丸またはボックスまたはカーリー) は、1 つの単語と見なす必要があります。括弧の外側にある部分は、空白 ' ' に基づいて分割する必要があります。

A) テストケース –

入力 -Andrew. (The Great Musician) John Smith-Lt.Gen3rd

結果 (文字列の配列) –<br> 1. アンドリュー。
2. 偉大な音楽家
3. ジョン
4. スミス-Lt.Gen3rd

B) テストケース –

入力 -Andrew. John

結果 (文字列の配列) –<br> 1. アンドリュー。
2. ジョン

C) テストケース –

入力 -Andrew {The Great} Pirate

結果 (文字列の配列) –<br> 1. アンドリュー
2. 大王
3. 海賊

入力は、個人またはその他のエンティティの名前です。現在のシステムは Access で書かれた非常に古いものです。彼らは一文字一文字スキャンすることでそれを行いました。C#に置き換えています。

私はそれを 2 つのステップで行うことを考えました。最初に括弧ベースの分割、次に単語分割です。

私はこれらのケースを悪い入力として捨てたかった -

  1. 開始括弧または終了括弧のみ使用可能

  2. ネストされた括弧

全体として、整形式の (開始括弧がある場合は、終了が必要です) 入力のみを分割したかったのです。

4

2 に答える 2

5

あなたの例から適切な結果を与える正規表現は次のとおりです。

\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)|(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s

|この正規表現は、 (OR) ステートメントで区切られた 2 つの部分に分かれています。

  1. \s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)()- 、[]、または のセットの前に空白を探します{}
  2. (?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s()- 、[]、またはのセットの後に空白を探します{}

各パーツの内訳は次のとおりです。

パート 1 ( \s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)):

1. \s             - matches white space
2. (?=            - Begins a lookahead assertion (What is included must exist after the \s
3. .*?            - Looks for any character any number of times. The `?` makes in ungreedy, so it will grab the least number it needs
4. (?:\(|\{|\[)   - A non passive group looking for `(`, `{`, or `[`
5. .*?            - Same as #3
6. (?:\]|\}|\))   - The reverse of #4
7. .*?            - Same as #3
8. )              - Closes the lookahead.  #3 through #7 are in the lookahead.

パート 2 も同じですが、先読み ( (?=))の代わりに後読み ( (?<=))があります。

著者による質問編集後:

完全な括弧のみを含む行を検索する正規表現の場合、これを使用できます。

.*\(.*(?=.*?\).*?)|(?<=.*?\(.*?).*\).*

(これを使用してand){and}または[andに置き換えることができるため、]完全な中括弧と角括弧が得られます。

于 2013-03-11T22:14:06.150 に答える
1

これはどう:

Regex regexObj = new Regex(
    @"(?<=\()       # Assert that the previous character is a (
    [^(){}[\]]+     # Match one or more non-paren/brace/bracket characters
    (?=\))          # Assert that the next character is a )
    |               # or
    (?<=\{)[^(){}[\]]+(?=\}) # Match {...}
    |               # or 
    (?<=\[)[^(){}[\]]+(?=\]) # Match [...]
    |               # or
    [^(){}[\]\s]+   # Match anything except whitespace or parens/braces/brackets", 
    RegexOptions.IgnorePatternWhitespace);

これは、ネストされた括弧/中括弧/大括弧がないことを前提としています。

于 2013-03-11T21:37:30.853 に答える