我有以下字符串:
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)
答案 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
如果你想从头到尾完全匹配那个确切的字符串。
^Seat\s([0-9]+):\s(.+)\s\(.([0-9.]+)\sin\schips\)$
我决定放一个“。”对于欧元货币符号,以防万一货币变为美元或其他东西它仍然有效。不确定这是否是你想要的,但在这里:)。