2012-08-09 78 views
0

設置想寫一個正則表達式,可以拆分標題和作者給出的語法:正則表達式 - 字符排斥組

作者名稱 - 標題

標題可以包含多個「 - 」。

我有以下的正則表達式:([^-]*) - (.*)

這適用於大多數情況下,例如

Douglas Adams - Life, The Universe & Everything 

分裂成Douglas AdamsLife, The Universe & Everything

,但未能爲雙筒作者姓名 - 例如Ayize Jama-Everett - Some Book Title我然後得到:

作者= Everett

所以我想改變排斥組[^-]排除組" - ",如名字連字符不會有他們周圍的空間。

我該怎麼做?

+3

這將有助於瞭解什麼語言/庫你有這樣做,因爲一些正則表達式的功能有所不同。 – jtbandes 2012-08-09 20:43:36

+0

這沒關係 - 任何語言的工作答案都適用於我,因爲一旦我知道了理論 – BonyT 2012-08-09 20:45:50

+0

''[^ - ] *'將永遠不會與任何完整的標題匹配'-',你指定。 – kevlar1818 2012-08-09 20:45:56

回答

3

看起來你需要lazy quantifier

(.*?) - (.*) 

第一組將獲得-前符號的最小數量。第二個將捕獲其餘的。如果字符串中沒有-,它將不匹配。

取決於你如何使用它。您還可以強制將其與整個字符串匹配將開始和結束量詞:

^(.*?) - (.*)$ 
+0

完美 - 謝謝 – BonyT 2012-08-09 20:47:24

+1

沒有?是必不可少的,否則第一個捕獲小組將包括標題的部分,如果標題還包含問題中指出的空格連字符空間組合 – BonyT 2012-08-09 20:52:57

-1

的「性格」類一切,但空間連字符空間看起來像TBIS,這是一個很好的理由不這樣做這種方式(在Perl示例):

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

使用重複一次或多次交替[^-][^ ]-[^ ](非空間,連字符,非空間)。角色類必須是一個角色 - 但替代品不會。

相反,你應該用「分裂」(或其他等值你的語言)

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

這需要一切都交給-,並把它放在$作者,然後在標題中的其餘部分。

1

如果您知道「 - 」是作者姓名和書名之間的分隔符,只需在該分隔符上進行簡單的字符串拆分即可。一個正則表達式似乎對此有點矯枉過正。

在Python:

>>> "Author Name-Hyphen - Book Title".split(" - ") 
['Author Name-Hyphen', 'Book Title']