2

空白の後にハイフン「-」が続く部分まで文字列を表示する正規表現を作成しようとしています。このパターンが見つからない場合は、文字列全体を表示する必要があります。文字列には他の空白やハイフンが含まれる場合があります。

次の正規表現は、目的の部分が $1 に含まれるほとんどの文字列値で機能します。

^([^ ]+[^-]+)( -).+

入力文字列と、上記の正規表現のグループ 1 で一致したもの -

  • ロンドン-パリ 東京 --> ロンドン-パリ
  • ロンドン マドリッド - パリ-ベルリン-ローマ - 東京 --> ロンドン マドリッド
  • ロンドン パリ - ベルリン 東京 --> ロンドン パリ
  • ロンドン・パリ --> ロンドン・パリ

ただし、上記の正規表現は次のケースには一致しません。

  • ロンドン パリ (一部テキスト) - ベルリン/東京

私は正規表現のいくつかのバリエーションを試しましたが、これも否定的な先読みを使用しましたが、役に立ちませんでした。

どんな助けでも大歓迎です!ありがとう

編集: 有益で説明的な提案をしてくれた皆さんに感謝しますが、以下の@Vinceによる回答は私のニーズにぴったりでした。以下にコメントを追加しました

4

4 に答える 4

3

私は貪欲ではないキュアンティファイアを使用し、その後、スペースの後にハイフンが続くか、行末かの二重チェックを行います。

#!/usr/bin/env perl

use warnings;
use strict;

while (<DATA>) {
        m/^(.*?)(?:\s+-|$)/ && print "$1\n";
}

__DATA__
London-Paris Tokyo
London Madrid - Paris-Berlin-Rome - Tokyo
London Paris - Berlin Tokyo
London Paris
London Paris (some-text) - berlin/tokyo

次の結果が得られます。

London-Paris Tokyo
London Madrid
London Paris
London Paris
London Paris (some-text)
于 2013-09-03T08:49:51.443 に答える
2

次のようなもの (Java コード) を使用することもできます。

String str = "London Paris";
String substr[] = str.split("\\s+-");
return substr[0];

次のような場合に機能します。

London-Paris Tokyo --> London-Paris
London Madrid - Paris-Berlin-Rome - Tokyo --> London Madrid
London Paris - Berlin Tokyo --> London Paris
London Paris --> London Paris

編集:ReplaceAllの使用:

str.replaceAll("\\s*-.*", "")
于 2013-09-03T09:28:37.810 に答える
2

あなたの正規表現が一致します

start of the line
followed by one or  more non-whitespaces
followed by one or more non-hyphens
followed by whitespace
followed by hyphen
followed by one or more anything

それはあなたが望むものではありません。あなたがしたい

one or more anything
followed by whitespace
followed by hyphen
followed by one or more anything

これは、次の正規表現で実現できます

^(.+)\s-.+$

の最初の組み合わせに一致させたい場合は\s-、非欲張りを使用できます+?

^(.+?)\s-.+$

これは-、文字列に a がある場合にのみ一致します。そうじゃなくても合わせたいなら、その部分をオプションにしないといけない。

^(.+?)(\s-.+)?$

これで、正規表現は任意の文字列に一致し、文字列に含まれる場合は-その前の部分が $1 に保存されます。

于 2013-09-03T08:50:14.120 に答える
0

私はあなたの問題を後方に持っていると思います。スペース/ハイフンの前のテキストを見つけて抽出しようとしていますが、スペース/ハイフンの後のテキストを見つけて何も置き換えないでください。そうすれば、正規表現が一致する場合にのみアクションが実行されます。それ以外の場合は、元のテキストを保持します。私は Perl プログラマーではありませんが、次のようなものが必要だと思います。

$string =~ s/ -.*$//;
于 2013-09-03T08:52:46.333 に答える