如何编写正则表达式以仅返回此字符串的某些部分?

How to write regex to return only certain parts of this string?

提问人:Andrew G. Johnson 提问时间:8/20/2008 最后编辑:Suganthan Madhavan PillaiAndrew G. Johnson 更新时间:8/5/2018 访问量:1212

问:

因此,我正在做一个项目,允许用户从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 正则表达式教程的链接或我应该使用的命令名称。

PHP 正则表达式

评论


答:

2赞 Ellen Teapot 8/20/2008 #1

查看 PHP 手册中的 PCRE 部分。此外,http://www.regular-expressions.info/ 是学习正则表达式的好网站。免责声明:一旦你学会了正则表达式,它就会非常容易上瘾。

4赞 Adam Haile 8/20/2008 #2

如果不尝试,我不完全确定到底该用什么,但是我一直用来验证我的正则表达式的一个很棒的工具是 RegExr,它为尝试您的正则表达式提供了一个很好的闪存界面,包括实时匹配和预定义片段库。绝对是一个节省时间的好:)

2赞 Brian Warshaw 8/20/2008 #3

我总是在 PHP 中使用 preg_ 的 REGEX 函数集,因为与 PERL 兼容的表达式具有更多的功能。这种额外的功能不一定在这里发挥作用,但它们也应该更快,所以为什么不使用它们,对吧?

对于表达式,请尝试以下操作:

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

您可以在每一行上使用 preg_match(),将结果存储在数组中。然后,您可以获得这些结果并根据需要操作它们。

编辑:

顺便说一句,您还可以在整个文本块上运行 pregmatchall(而不是逐行循环)并以这种方式获得结果。__

-1赞 Kibbee 8/20/2008 #4
Seat [number]: [letters&numbers&characters] ([number] in chips)

您的正则表达式应如下所示

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

括号可让您捕获座位号、名称和组中的筹码数量。

-1赞 Roy Rico 8/20/2008 #5

您必须按换行符拆分文件, 然后遍历每一行并应用以下逻辑

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

我还没有运行此代码,因此您可能需要修复一些错误...

0赞 Andrew G. Johnson 8/20/2008 #6

这是我目前正在使用的:

preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
1赞 Joel Meador 8/20/2008 #7

查看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了,所以这可能会有点或很多。

4赞 Andy 8/20/2008 #8

像这样的东西可能会解决问题:

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

以及关于正则表达式工作原理的一些基本解释:

  • \d = 数字。

  • \<character> = 转义字符,如果不是任何字符类或子表达式的一部分。例如:

    \t将呈现一个制表符,而将呈现“\t”(因为反斜杠被转义)。\\t

  • + = 前面的一个或多个元素。

  • * = 零个或多个前一个元素。

  • [ ] = 括号表达式。匹配括号内的任何字符。也适用于范围(例如 A-Z)。

  • [^ ] = 匹配括号内不符内的任何字符。

  • ( ) = 标记的子表达式。在此匹配的数据可以稍后调用。

无论如何,我选择使用

([^\(]+)

因为该示例提供了一个包含空格的名称(示例中的座位 3)。这样做的目的是匹配任何角色,直到它遇到开头的异构。 这将在子表达式的末尾留出一个空格(使用示例中提供的数据)。但是,可以使用 PHP 中的 trim() 命令轻松去除他的文件。

如果你不想匹配空格,只匹配字母数字字符,你可以这样:

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

它将匹配任何字母(在 AZ 内,包括大写和小写)、数字以及连字符和下划线。

或相同的变体,带有空格:

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

其中“\s”的计算结果为空格。

希望这对:)有所帮助

评论

0赞 OIS 12/1/2008
\((\d+)in chips\) 应该有一个类似 \((\d+) in chips\) 的空间
0赞 Imran 8/20/2008 #9

要一次处理整个输入字符串,请使用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 版。如果你真的想学习正则表达式,没有什么能比得上这本书了。尽管是正则表达式的权威指南,但这本书对初学者非常友好。

0赞 A. Zalonis 10/14/2013 #10

试试这段代码。它对我有用

假设您有以下几行字符串

$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)";
}
1赞 Suganthan Madhavan Pillai 10/29/2014 #11

可能是很晚的回答,但我有兴趣回答

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

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