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

时间:2020-03-05 18:40:48  来源:igfitidea点击:

因此,我正在开发一个项目,该项目将允许用户从诸如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)

关于学习正则表达式:获取精通正则表达式,第三版。如果我们真的想学习正则表达式,那么没有什么比这本书更合适的了。尽管它是正则表达式的权威指南,但它对初学者非常友好。