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

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

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

Поэтому я использую 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 или название команды, которую я должен использовать.

19.08.2008 17:09:18
11 ОТВЕТОВ

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

2
19.08.2008 17:13:19

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

4
19.08.2008 17:16:20

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

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

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

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

РЕДАКТИРОВАТЬ:

Кстати, вы также можете запустить preg _match _all для всего блока текста (вместо циклического прохождения строки за строкой) и получить результаты таким же образом.

2
19.08.2008 17:24:01
Seat [number]: [letters&numbers&characters] ([number] in chips)

Ваш Regex должен выглядеть примерно так

Seat (\d+): ([a-zA-Z0-9]+) \((\d+) in chips\)

Скобки позволят вам зафиксировать номер места, название и количество фишек в группах.

-1
5.08.2018 15:09:16

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

$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>";
  }
}

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

-1
19.08.2008 17:23:04

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

preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
0
19.08.2008 17:27:33

Проверьте 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, так что это может быть немного или много. *

1
19.08.2008 17:29:09

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

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

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

  • \ d = цифра

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

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

  • + = один или несколько из предыдущего элемента.

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

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

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

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

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

([^\(]+)

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

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

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

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

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

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

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

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

4
19.08.2008 18:13:53
\ ((\ d +) в фишках \) должно иметь пробел, как \ ((\ d +) в фишках \)
OIS 30.11.2008 19:36:07

Чтобы обработать всю входную строку одновременно, используйте 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
20.08.2008 07:35:46

Попробуйте этот код. Меня устраивает

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

$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
14.10.2013 12:47:16

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

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

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

1
29.10.2014 06:40:36