0

我有以下字符串:

Seat 6: Dizzy (€26.49 in chips) 

我想解析座位号 (6)、播放器的屏幕名称 (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

4 回答 4

3

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

([^(]*)

至:

(.*)

量词默认是贪婪的——它们会尽可能地匹配,同时仍然允许模式的其余部分匹配。在这种情况下,您希望将所有内容匹配到最后一个 (字符。

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

有关此修改如何影响匹配的说明,请参阅此测试。

于 2013-09-03T18:44:23.013 回答
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\)$/
于 2013-09-03T18:49:27.407 回答
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]*    
 \)
于 2013-09-03T19:07:54.497 回答
0
Seat\s([0-9]+):\s(.+)\s\(.([0-9.]+)\s

正则表达式可视化

在 Debuggex 上实时编辑

如果您想从头到尾完全匹配该确切字符串。

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

正则表达式可视化

在 Debuggex 上实时编辑

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

于 2013-09-03T19:45:01.337 回答