如何编写正则表达式以仅返回此字符串的某些部分?
因此,我正在开发一个项目,该项目将允许用户从诸如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)
我想提取座位编号,名称和筹码数量,因此格式为
Seat [number]: [letters&numbers&characters] ([number] in chips)
我没有从哪里开始的想法,甚至没有什么命令可以优化我的想法。
任何建议都将不胜感激,即使它只是指向PHP regex教程的链接或者我应使用的命令名称也是如此。
解决方案
回答
查看PHP手册中的PCRE部分。另外,http://www.regular-expressions.info/是学习正则表达式的好网站。免责声明:学习过Regex后,它会非常上瘾。
回答
我不确定是否要尝试使用它的确切用途,但是我一直使用的一种出色工具来验证我的RegEx是RegExr,它提供了一个出色的Flash界面来试用正则表达式,包括实时匹配和库要使用的预定义代码段。绝对是省时的好方法:)
回答
我总是对PHP的REGEX使用preg_函数集,因为与PERL兼容的表达式具有更多的功能。额外的功能不一定要在这里发挥作用,但是它们也应该更快,所以为什么不使用它们呢,对吗?
对于表达式,请尝试以下操作:
/Seat (\d+): ([^ ]+) \((\d+)/
我们可以在每行上使用preg_match(),将结果存储在数组中。然后,我们可以获取这些结果并根据需要进行操作。
编辑:
顺便说一句,我们也可以在整个文本块上运行preg_
match_
(而不是逐行循环),并以这种方式获得结果。
回答
Seat [number]: [letters&numbers&characters] ([number] in chips)
Regex应该看起来像这样
Seat (\d+): ([a-zA-Z0-9]+) \((\d+) 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>"; } }
我尚未运行此代码,因此我们可能必须修复一些错误...
回答
这是我目前正在使用的:
preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$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); ?>
*自从我写了php已经有一段时间了,所以可能会少很多。
回答
这样的事情可能会解决问题:
/Seat (\d+): ([^\(]+) \((\d+)in chips\)/
关于正则表达式如何工作的一些基本解释:
- \ d =数字。
- \ <字符> =转义字符,如果不是任何字符类或者子表达式的一部分。例如:
\ t
会渲染一个制表符,而\\ t
会渲染" \ t"(因为反斜杠被转义了)。 - =前一个或者多个元素。
- =零个或者多个前一个元素。
- [] =方括号表达式。匹配括号内的任何字符。也适用于范围(例如A-Z)。
- [^] =匹配不在方括号内的任何字符。
- ()=标记的子表达式。此后匹配的数据可以稍后调用。
无论如何,我选择使用
([^\(]+)
因为该示例提供了一个包含空格的名称(示例中为座位3)。它的作用是匹配任何字符,直到遇到开放的括号。
这将在子表达式的末尾留下一个空格(使用示例中提供的数据)。但是,可以使用PHP中的trim()命令轻松删除他的代码。
如果我们不想匹配空格,只能匹配字母数字字符,则可以这样:
([A-Za-z0-9-_]+)
可以匹配任何字母(在A-Z内,大写和小写),数字以及连字符和下划线。
或者相同的变体,带有空格:
([A-Za-z0-9-_\s]+)
其中" \ s"被评估为空格。
希望这可以帮助 :)
回答
要一次处理整个输入字符串,请使用preg_match_all()
。
preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);
对于输入字符串,$ matches的var_dump如下所示:
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)
关于学习正则表达式:获取精通正则表达式,第三版。如果我们真的想学习正则表达式,那么没有什么比这本书更合适的了。尽管它是正则表达式的权威指南,但它对初学者非常友好。