从PokerStars历史中解析席位

时间:2013-09-03 18:40:43

标签: javascript regex

我有以下字符串:

Seat 6: Dizzy (€26.49 in chips) 

我想解析seatNumber(6),播放器的screenName(Dizzy)和堆栈(26.49)。只有一个正则表达式可以吗?

这是我的尝试:

    Seat.([0-9]) 
    :
    .   //Space
    ([^(]*)  //screenName (everything but the next opening parenthesis)
    \(
    [^0-9]+ // the euro or dollar sign
    ([0-9\.]+) // the stack
    .in.chips 

但很明显,如果screenName有一个括号,它不起作用,例如:

Seat 3: padre(93) (€10.52 in chips) 

4 个答案:

答案 0 :(得分:3)

您的“screenName”部分需要调整:

([^(]*)

要:

(.*)

默认情况下,量词是贪婪的 - 它们会尽可能匹配,同时仍允许其余模式匹配。在这种情况下,您希望将所有内容与最后 (字符进行匹配。

以这种方式修改模式将导致.*模式匹配到字符串末尾的所有内容,但正则表达式引擎会注意到这会导致模式无法匹配。然后它将回溯直到最后(,其中模式的其余部分将匹配。

请参阅this test,了解此修改将如何影响匹配。

答案 1 :(得分:2)

首先关闭.并不代表'空格',它意味着任何字符。当你真正意味着空间时使用.会导致一些意想不到的结果。我推荐这样的东西:

Seat
\s+          // one or more whitespace characters
(\d+)        // one or more digits
:            // colon
\s+          // one or more whitespace characters
(.+?)        // one or more of any characters, non-greedily
\s+          // one or more whitespace characters
\(           // open paren
[€$]         // the euro or dollar sign
(\d+\.\d+)   // the stack
\s+          // one or more whitespace characters
in chips     // literal 'in chips'
\)           // close paren

可能也希望将start(^)和end($)锚点放在此处。最后,您的模式将如下所示:

/^Seat\s+(\d+):\s+(.+?)\s+\([€$]\d+\.\d+)\s+in chips\)$/

答案 2 :(得分:0)

很难知道你在看什么变化。 这是您可以采取的一种途径 -

 Seat
 [^\S\n]+                     

 ( [0-9]+ )                   // seat number
 : [^\S\n]+                   

 ( .+ )                       // screenName
 [^\S\n]+                     

 \(
 [^\S\n]* 

 [^0-9.]+                     // dollar
 ( [0-9.]+ )                  // the stack

 [^\S\n]+ in [^\S\n]+ chips [^\S\n]*    
 \)

答案 3 :(得分:0)

Seat\s([0-9]+):\s(.+)\s\(.([0-9.]+)\s

Regular expression visualization

Edit live on Debuggex

如果你想从头到尾完全匹配那个确切的字符串。

^Seat\s([0-9]+):\s(.+)\s\(.([0-9.]+)\sin\schips\)$

Regular expression visualization

Edit live on Debuggex

我决定放一个“。”对于欧元货币符号,以防万一货币变为美元或其他东西它仍然有效。不确定这是否是你想要的,但在这里:)。