Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как написать regex, чтобы вернуть только определенные части этой строки?
Поэтому я работаю над проектом, который позволит пользователям вводить истории покерных рук с таких сайтов, как PokerStars, а затем отображать им руку.
Кажется, что regex будет отличным инструментом для этого, однако я оцениваю свои знания regex на "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)
Я хочу извлечь seat number, name, & chip count , поэтому формат
Seat [number]: [letters&numbers&characters] ([number] in chips)
Я понятия не имею, с чего начать или какие команды я должен даже использовать для оптимизации этого.
Любые советы очень ценятся - даже если это просто ссылка на учебник по PHP regex или имя команды(команд), которую я должен использовать.
Я не совсем уверен, что именно использовать для этого, не пробуя его, но отличный инструмент, который я использую все время для проверки моего RegEx, - это RegExr , который дает отличный интерфейс flash для тестирования вашего regex, включая сопоставление в реальном времени и библиотеку предопределенных фрагментов для использования. Определенно отличная экономия времени :)
Что-то вроде этого может сделать трюк:
/Seat (\d+): ([^\(]+) \((\d+)in chips\)/
И некоторые основные объяснения о том, как работает Regex:
\d = цифра.
\<character> = экранирует символ, если он не является частью какого-либо класса символов или подвыражения. например:
\tбудет отображать вкладку, в то время как\\tбудет отображать "\t" (поскольку обратная косая черта экранирована).+ = один или несколько предыдущих элементов.
* = ноль или более предыдущего элемента.
[ ] = выражение в скобках. Соответствует любому из символов в скобках. Также работает с диапазонами (напр. A-Z).
[ ^ ] = Соответствует любому символу NOT в скобках.
( ) = Отмеченное подвыражение. Данные, сопоставленные в пределах этого, могут быть вызваны позже.
В любом случае, я решил использовать
([^\(]+)
поскольку пример предоставляет имя, содержащее пробелы (место 3 в Примере). что это делает, так это то, что он соответствует любому символу до такой степени, что он сталкивается с открывающим парантезом. Это оставит вас с пустым пространством в конце подвыражения (используя данные, представленные в Примере). Однако его можно легко удалить с помощью команды trim() в PHP.
Если вы не хотите сопоставлять пробелы, только буквенно-цифровые символы, вы можете сделать что-то вроде этого:
([A-Za-z0-9-_]+)
Который будет соответствовать любой букве (в пределах A-Z, как верхний-& нижний регистр), число, а также дефисы и подчеркивания.
Или тот же вариант, с пробелами:
([A-Za-z0-9-_\s]+)
Где "\s " вычисляется в пространстве.
Надеюсь, это поможет :)
Посмотрите на раздел PCRE в руководстве PHP. Кроме того, http://www.regular-expressions.info/ является отличным сайтом для изучения regex. Отказ от ответственности: Regex очень затягивает, как только вы его узнаете.
Я всегда использую набор функций preg_ для REGEX в PHP, потому что PERL-совместимые выражения имеют гораздо больше возможностей. Эти дополнительные возможности не обязательно вступают в игру здесь, но они также должны быть быстрее, так почему бы не использовать их в любом случае, верно?
Для выражения, попробуйте это:
/Seat (\d+): ([^ ]+) \((\d+)/
Вы можете использовать preg_match() на каждой строке, сохраняя результаты в массиве. Затем вы можете получить эти результаты и манипулировать ими, как вам нравится.
EDIT:
Кстати, вы также можете запустить preg _ match _ all на всем блоке текста (вместо циклического перебора line-by-line) и получить результаты таким же образом.
Проверьте функции 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);
?>
*It's прошло некоторое время с тех пор, как я сделал php, так что это может быть немного или много.*
Может быть, это очень поздний ответ, но я заинтересован в ответе
Seat\s(\d):\s([\w\s]+)\s\((\d+).*\)
http://regex101.com/r/cU7yD7/1
Чтобы обработать всю входную строку сразу, используйте preg_match_all()
preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);
Для вашей входной строки var_dump $matches будет выглядеть следующим образом:
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)
На изучение regex: получить освоение регулярных выражений, 3-е издание. Ничто другое не приближается к этой книге, если вы действительно хотите узнать regex. Несмотря на то, что это окончательное руководство по regex, книга очень дружелюбна к новичкам.
Попробуйте этот код. Это работает для меня
Пусть говорят, что у вас есть ниже строк строк
$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)";
}
вам придется разбить файл на разрывы строк, затем цикл через каждую строку и применить следующую логику
$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>";
}
}
Я не запускал этот код, поэтому вам, возможно, придется исправить некоторые ошибки...