2013-09-03 2 views
0

у меня есть следующие строки:Разбор мест от PokerStars История

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

Могут ли имена экранов иметь пробелы? Если нет, замените '(' for '\ s'. – epascarello

+1

yep у них могут быть пробелы. – edi9999

ответ

3

Вашего раздел «ScreenName» должен быть скорректирован от:

([^(]*) 

To:

(.*) 

Квантеры жадные по умолчанию - они будут соответствовать как можно больше, при этом позволяя остальной части шаблона соответствовать. В этом случае вы хотите сопоставить все с последним( персонажем.

Изменение шаблона таким образом приведет к тому, что шаблон .* будет соответствовать всем концам строки, но механизм регулярных выражений заметит, что это приводит к тому, что шаблон не соответствует. Затем будет backtrack до последнего (, где будет соответствовать остальная часть шаблона.

См. this test для иллюстрации того, как эта модификация повлияет на совпадения.

+0

Спасибо большое, я знал это, но это напоминание поможет мне запомнить трюк навсегда :-) – edi9999

2

Первый раз . не означает 'space', это означает любой знак вообще. Использование ., когда вы действительно имеете в виду пространство, может привести к неожиданным результатам. Я бы рекомендовал что-то вроде этого:

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 

Вы может также хочет положить начало (^) и конец ($) анкеров вокруг этого, а также. В конце концов, ваш рисунок будет выглядеть так:

/^Seat\s+(\d+):\s+(.+?)\s+\([€$]\d+\.\d+)\s+in chips\)$/ 
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]*  
\) 
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

я решил поставить "" для денежного знака евро на всякий случай, если валюта изменится на доллары или что-то еще, она все равно будет работать. Не уверен, что это то, что вы хотели, но здесь :).

Смежные вопросы