如何编写正则表达式以仅返回此字符串的某些部分?
Posted
技术标签:
【中文标题】如何编写正则表达式以仅返回此字符串的某些部分?【英文标题】:How to write regex to return only certain parts of this string? 【发布时间】:2010-09-06 04:54:39 【问题描述】:所以我正在开发一个项目,该项目将允许用户从 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 正则表达式教程的链接或我应该使用的命令的名称。
【问题讨论】:
【参考方案1】:如果不尝试,我不完全确定到底要使用什么,但我一直用来验证我的 RegEx 的一个很棒的工具是 RegExr,它提供了一个很棒的 flash 界面来尝试你的 regex,包括真正的时间匹配和要使用的预定义 sn-ps 库。绝对是节省时间的好方法:)
【讨论】:
【参考方案2】:这样的事情可能会奏效:
/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”被计算为空格。
希望这会有所帮助:)
【讨论】:
\((\d+)inchips\) 应该有一个空格,如 \((\d+)inchips\)【参考方案3】:查看 PHP 手册中的 PCRE 部分。此外,http://www.regular-expressions.info/ 是学习正则表达式的好网站。免责声明:正则表达式一旦学会就会上瘾。
【讨论】:
【参考方案4】:我总是在 PHP 中为 REGEX 使用 preg_ 函数集,因为与 PERL 兼容的表达式有更多的功能。这种额外的能力在这里不一定会发挥作用,但它们也应该更快,所以为什么不使用它们,对吧?
对于表达式,试试这个:
/Seat (\d+): ([^ ]+) \((\d+)/
您可以在每一行上使用 preg_match(),将结果存储在一个数组中。然后,您可以获取这些结果并根据需要进行操作。
编辑:
顺便说一句,您也可以在整个文本块上运行 preg_
match_
all(而不是逐行循环)并以这种方式获得结果。
【讨论】:
【参考方案5】:查看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了,所以这个可能有点或很多。*
【讨论】:
【参考方案6】:可能答案很晚,但我有兴趣回答
Seat\s(\d):\s([\w\s]+)\s\((\d+).*\)
http://regex101.com/r/cU7yD7/1
【讨论】:
【参考方案7】:这是我目前正在使用的:
preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
【讨论】:
【参考方案8】:要一次处理整个输入字符串,请使用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)
关于学习正则表达式:掌握正则表达式,第 3 版。如果你真的想学习正则表达式,没有什么能比得上这本书了。尽管这本书是正则表达式的权威指南,但它对初学者非常友好。
【讨论】:
【参考方案9】:试试这个代码。它对我有用
假设您有以下几行字符串
$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)";
【讨论】:
【参考方案10】:你必须用换行符分割文件, 然后遍历每一行并应用以下逻辑
$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>";
我还没有运行这段代码,所以你可能需要修复一些错误...
【讨论】:
【参考方案11】:Seat [number]: [letters&numbers&characters] ([number] in chips)
您的正则表达式应如下所示
Seat (\d+): ([a-zA-Z0-9]+) \((\d+) in chips\)
括号可让您捕获座位号、名称和分组筹码数量。
【讨论】:
以上是关于如何编写正则表达式以仅返回此字符串的某些部分?的主要内容,如果未能解决你的问题,请参考以下文章