0

この質問は、私の前の質問の続きです。

学位を除外する正規表現

文字ドット (.) を含む正規表現を使用して、段落文字列を文の配列に分割したい。そして次の問題は数の問題です。

例を次に示します。

今年は 2013 年です。こんにちは、アンドレさん、あなたのお金は 40,000 ルピアです。

もちろん正しい出力:

配列 ( [0] => 今年 2013 年 [1] => こんにちはアンドレさん、あなたのお金は Rp 40.000 です)

タイトルの問題(さん)は、以前の私の質問からすでに解決されています。数値の正規表現を追加してみましたが、まだ機能しません。

私の働いていないコード:

$titles_number=array('(^[0-9]*)','(?<!Mr)', '(?<!Mrs)', '(?<!Ms)');
$sentences=preg_split('/('.implode('',$titles_number).')\./',$text);
print_r($sentences);

これを 1 回の打撃で実行できますか (1 つの正規表現で 2 つの問題を解決できますか)。できないなら言ってください。前もって感謝します

4

2 に答える 2

1

これは、次の方法で簡単に達成できますpreg_match_all()

preg_match_all(
    '/[^\s.][^.]*(?:\.(?:(?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.)|(?=\d))[^.]*)*\./',
    $subject, $result, PREG_PATTERN_ORDER);
print_r($result[0]);

説明:

  • [^\s.]次の非空白文字に一致します (つまり、文間の空白をスキップします)
  • [^.]*ドット以外の文字をむさぼり食う
  • \.ドット IF に一致します...
  • (?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.)…敬語の一部です…
  • (?=\d)...または数値の一部

ノート:

  1. (?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.)代替が最上位にあるため、正当です。つまり、それぞれ固定長のいくつかの個別の後読みのように機能します。\.そのため、 を使用する代わりに、すべてのブランチでを繰り返さなければなりませんでした(?<=(?:Prof|Dr|Mr|Mrs|Ms)\.)

  2. \.(?=\d)数字の一部であるドットを識別するには十分なようです。ドットの前後の数字を本当にチェックする必要がある場合は、(?=(?<=\d\.)\d)代わりに使用できます。

  3. これが宿題の問題よりも深刻な場合は、正規表現を破棄して、自然言語処理ライブラリを探す必要があります。これはすべて大雑把ですが、正規表現でできることの限界に非常に近いです。

于 2013-05-02T04:48:38.903 に答える