1

特定の単語 (例では「AND」) で区切られた妥当な長さの 2 つのサブセンテンスをグループ化しようとしています。いくつかの例:

ケース1:

foo sentence A AND foo sentence B

与える

"foo sentence A" --> matching group 1

"AND" --> matching  group 2 (optionally)

"foo sentence B" --> matching  group 3

ケース2:

foo sentence A

与える

"foo sentence A" --> matching  group 1
"" --> matching  group 2 (optionally)
"" --> matching  group 3

次の正規表現を試しました

(.*) (AND (.*))?$

それは機能しますが、CASE2 で文字列の最後の位置に空白を入れた場合にのみ機能します。そうしないと、パターンが一致しません。丸括弧グループ内の「AND」の前にスペースを含めると、ケース 1 では、マッチャーは最初のグループに文字列全体を含めます。先読みアサーションと後読みアサーションについて疑問に思いましたが、それらが私を助けることができるかどうかはわかりません。なにか提案を?ありがとう

4

5 に答える 5

2

説明

この正規表現は、要求された文字列部分を要求されたグループに返します。はオプションです。and文字列内に見つからない場合は、文字列全体がグループ 1 に配置されます。すべては\s*?、キャプチャされたグループの空白が自動的にトリミングされるように強制します。

^\s*?\b(.*?)\b\s*?(?:\b(and)\b\s*?\b(.*?)\b\s*?)?$

ここに画像の説明を入力

グループ

0 は一致する文字列全体を取得します

  1. 区切り単語の前の文字列を取得しますand。そうでないand場合は、文字列全体がここに表示されます
  2. 区切りの単語を取得します。この場合はand
  3. 文字列の 2 番目の部分を取得します

Java コード例:

ケース1

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "foo sentence A AND foo sentence B";
  Pattern re = Pattern.compile("^\\s*?\\b(.*?)\\b\\s*?(?:\\b(and)\\b\\s*?\\b(.*?)\\b\\s*?)?$",Pattern.CASE_INSENSITIVE);
  Matcher m = re.matcher(sourcestring);
    if(m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + groupIdx + "] = " + m.group(groupIdx));
      }
    }
  }
}

$matches Array:
(
    [0] => foo sentence A AND foo sentence B
    [1] => foo sentence A
    [2] => AND
    [3] =>  foo sentence B
)

ケース 2、同じ正規表現を使用

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "foo sentence A";
  Pattern re = Pattern.compile("^\\s*?\\b(.*?)\\b\\s*?(?:\\b(and)\\b\\s*?\\b(.*?)\\b\\s*?)?$",Pattern.CASE_INSENSITIVE);
  Matcher m = re.matcher(sourcestring);
    if(m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + groupIdx + "] = " + m.group(groupIdx));
      }
    }
  }
}

$matches Array:
(
    [0] => foo sentence A
    [1] => foo sentence A
)
于 2013-05-26T04:20:43.547 に答える
2

そのまま使ってみてはどうですか

String split[] = sentence.split("AND");

これにより、文が単語ごとに分割され、サブパートのリストが表示されます。

于 2013-05-25T21:22:57.350 に答える
2

私はこの正規表現を使用します:

^(.*?)(?: (AND) (.*))?$

説明:

The regular expression:

(?-imsx:^(.*?)(?: (AND) (.*))?$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
----------------------------------------------------------------------
                             ' '
----------------------------------------------------------------------
    (                        group and capture to \2:
----------------------------------------------------------------------
      AND                      'AND'
----------------------------------------------------------------------
    )                        end of \2
----------------------------------------------------------------------
                             ' '
----------------------------------------------------------------------
    (                        group and capture to \3:
----------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
----------------------------------------------------------------------
    )                        end of \3
----------------------------------------------------------------------
  )?                       end of grouping
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
于 2013-05-26T09:41:52.477 に答える
0

あなたのケース2は少し奇妙です...

しかし、私はするだろう

String[] parts = sentence.split("(?<=AND)|(?=AND)"));

をチェックしparts.lengthます。length==1 の場合、case2 です。配列に文があるだけで、「group2/3」として空の文字列を追加できます

ケース1の場合、直接持っていますparts

[foo sentence A , AND,  foo sentence B]
于 2013-05-25T21:30:27.693 に答える
0

Change your regex to make the space after he first sentence optional:

(.*\\S) ?(AND (.*))?$

Or you could use split() to consume the AND and any surrounding spaces:

String sentences = sentence.spli("\\s*AND\\s*");
于 2013-05-25T21:26:05.953 に答える