0

与えられた構文でタイトルと著者を分割できる正規表現を作成しようとしています:

著者名 - タイトル

タイトルには複数の「-」を含めることができます。

次の正規表現があります。([^-]*) - (.*)

これは、ほとんどの場合に機能します。

Douglas Adams - Life, The Universe & Everything

Douglas Adamsとに分かれるLife, The Universe & Everything

しかし、二重バレルの著者名では失敗します-たとえばAyize Jama-Everett - Some Book Title、次のようになります:

著者 =Everett

名前のハイフンにはスペースが含まれないため、グループ[^-]を除外するように除外グループを変更したいと思います。" - "

どうすればいいですか?

4

3 に答える 3

3

遅延量指定子が必要なようです:

(.*?) - (.*)

最初のグループは、 の前に最小数のシンボルを取得します-。2番目は残りをキャプチャします。文字列に no がない場合は一致しません-

使い方次第。start および end 量指定子を追加して、文字列全体と強制的に一致させることもできます。

^(.*?) - (.*)$
于 2012-08-09T20:45:46.103 に答える
1

「 - 」が著者名と本のタイトルの間の区切り文字であることがわかっている場合は、その区切り文字で単純な文字列分割を行うだけです。これには正規表現はやり過ぎのようです。

Python の場合:

>>> "Author Name-Hyphen - Book Title".split(" - ")
['Author Name-Hyphen', 'Book Title']
于 2012-08-09T20:53:09.043 に答える
-1

「文字」クラスは、スペース、ハイフン、スペース以外はすべてtbis のように見えます — これは、このようにしない正当な理由です (Perl の例):

say "author=($1) title=($2)"
    if q{foo bar-baz - taz-fraz daz} =~ m/((?: [^-]|(?:[^ ]-[^ ]))+ ) \s - \s (.+)/x
#                                          ^^^^^^^^^^^^^^^^^^^^^^^^
#                                          this mess here

これは、交互[^-]または[^ ]-[^ ](非スペース、ハイフン、非スペース) を 1 回以上繰り返して使用します。文字クラスは 1 文字でなければなりませんが、代替文字はそうではありません。

代わりに、「分割」(またはあなたの言語で同等のもの) を使用する必要があります。

my ($author, $title) = split(/ - /, $record, 2);

これは、すべてを-取得して $author に入れ、残りをタイトルに入れます。

于 2012-08-09T20:49:00.643 に答える