Как написать регулярное выражение, чтобы вернуть только определенные части этой строки? - PullRequest
1 голос
/ 19 августа 2008

Итак, я работаю над проектом, который позволит пользователям вводить истории покерных рук с таких сайтов, как PokerStars, а затем отображать им руки.

Кажется, что регулярное выражение было бы отличным инструментом для этого, однако я оцениваю свои знания регулярных выражений как "slim to none".

Итак, я использую PHP и перебираю этот блок текста построчно и в таких строках:

Seat 1: fabulous29 (835 in chips)

Seat 2: Nioreh_21 (6465 in chips)

Seat 3: Big Loads (3465 in chips)

Seat 4: Sauchie (2060 in chips)

Я хочу извлечь место number, name, & chip count, поэтому формат

Seat [number]: [letters&numbers&characters] ([number] in chips)

У меня НЕТ ИДЕИ, с чего начать или какие команды мне следует использовать, чтобы оптимизировать это.

Буду очень признателен за любой совет - даже если это просто ссылка на учебник по PHP regex или название команды (й), которые я должен использовать.

Ответы [ 11 ]

4 голосов
/ 19 августа 2008

Нечто подобное может сработать:

/Seat (\d+): ([^\(]+) \((\d+)in chips\)/

И некоторые основные объяснения того, как работает Regex:

  • \ d = цифра.

  • \ = экранирует символ, если не является частью какого-либо класса символов или подвыражения. например:

    \t будет отображать вкладку, в то время как \\t будет отображать "\ t" (поскольку обратный слеш экранирован).

  • + = один или несколько предшествующих элементов.

  • * = ноль или более предыдущего элемента.

  • [] = выражение в скобках. Соответствует любому из символов в скобках. Также работает с диапазонами (например, A-Z).

  • [^] = Соответствует любому символу, который НЕ находится в скобках.

  • () = отмеченное подвыражение. Соответствующие данные могут быть вызваны позже.

В любом случае, я решил использовать

([^\(]+)

, поскольку в примере указано имя, содержащее пробелы (место 3 в примере). то, что это делает, - то, что это соответствует любому символу вплоть до того, что это встречает вводный паратез. Это оставит вас с пробелом в конце подвыражения (используя данные, приведенные в примере). Однако его можно легко удалить с помощью команды trim () в PHP.

Если вы не хотите сопоставлять пробелы, только буквенно-цифровые символы, вы можете сделать что-то вроде этого:

([A-Za-z0-9-_]+)

Который будет соответствовать любой букве (в пределах A-Z, как в верхнем, так и в нижнем регистре), числе, а также дефисам и подчеркиванию.

или тот же вариант с пробелами:

([A-Za-z0-9-_\s]+)

Где "\ s" вычисляется как пробел.

Надеюсь, это поможет:)

4 голосов
/ 19 августа 2008

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

2 голосов
/ 19 августа 2008

Я всегда использую набор функций preg_ для REGEX в PHP, потому что PERL-совместимые выражения имеют гораздо больше возможностей. Эти дополнительные возможности не обязательно вступают в действие здесь, но они также должны быть быстрее, так почему бы не использовать их в любом случае, верно?

Для выражения попробуйте это:

/Seat (\d+): ([^ ]+) \((\d+)/

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

EDIT:

Кстати, вы также можете запустить preg _ match _ по всему текстовому блоку (вместо циклического перебора строки) и получить результаты таким же образом.

2 голосов
/ 19 августа 2008

Посмотрите на раздел PCRE в Руководстве по PHP. Кроме того, http://www.regular -expressions.info / - отличный сайт для изучения регулярных выражений. Отказ от ответственности: Regex очень затягивает, как только вы его изучите.

1 голос
/ 29 октября 2014

Может быть, уже очень поздно, но мне интересно отвечать

Seat\s(\d):\s([\w\s]+)\s\((\d+).*\)

http://regex101.com/r/cU7yD7/1

1 голос
/ 19 августа 2008

Проверить preg_match . Вероятно, ищет что-то вроде ...

<?php
$str = 'Seat 1: fabulous29 (835 in chips)';
preg_match('/Seat (?<seatNo>\d+): (?<name>\w+) \((?<chipCnt>\d+) in chips\)/', $str, $matches);
print_r($matches);
?>

* Прошло много времени с тех пор, как я написал php, так что может быть немного или совсем не в порядке. *

0 голосов
/ 14 октября 2013

Попробуйте этот код. У меня работает

Допустим, у вас есть строки строк ниже

$string1 = "Seat 1: fabulous29 (835 in chips)";
$string2 = "Seat 2: Nioreh_21 (6465 in chips)";
$string3 = "Seat 3: Big Loads (3465 in chips)";
$string4 = "Seat 4: Sauchie (2060 in chips)";

Добавить в массив

$lines = array($string1,$string2,$string3,$string4);
foreach($lines as $line )
{
  $seatArray = explode(":", $line);
  $seat = explode(" ",$seatArray[0]);
  $seatNumber = $seat[1];

  $usernameArray = explode("(",$seatArray[1]);
  $username = trim($usernameArray[0]);

  $chipArray = explode(" ",$usernameArray[1]);
  $chipNumber = $chipArray[0]; 

  echo "<br>"."Seat [".$seatNumber."]: [". $username."] ([".$chipNumber."] in chips)";
}
0 голосов
/ 20 августа 2008

Чтобы обработать всю входную строку одновременно, используйте preg_match_all()

preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);

Для вашей входной строки var_dump из $ match будет выглядеть так:

array
  0 => 
    array
      0 => string 'Seat 1: fabulous29 (835 in chips)' (length=33)
      1 => string 'Seat 2: Nioreh_21 (6465 in chips)' (length=33)
      2 => string 'Seat 4: Sauchie (2060 in chips)' (length=31)
  1 => 
    array
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '4' (length=1)
  2 => 
    array
      0 => string '835' (length=3)
      1 => string '6465' (length=4)
      2 => string '2060' (length=4)

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

0 голосов
/ 19 августа 2008

Вот что я сейчас использую:

preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
0 голосов
/ 19 августа 2008

вам придется разбить файл на разрывы строк, затем переберите каждую строку и примените следующую логику

$seat = 0;
$name = 1;
$chips = 2;

foreach( $string in $file ) {
  if (preg_match("Seat ([1-0]): ([A-Za-z_0-9]*) \(([1-0]*) in chips\)", $string, $matches)) {
    echo "Seat: " . $matches[$seat] . "<br>";
    echo "Name: " . $matches[$name] . "<br>";
    echo "Chips: " . $matches[$chips] . "<br>";
  }
}

Я не запускал этот код, поэтому вам, возможно, придется исправить некоторые ошибки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...