如何在统一文本中使用regx模式分解数组?

时间:2019-09-15 10:53:30

标签: php arrays regex preg-replace

我正在将文本从txt文件转换为数组。我需要使用正则表达式将该数组中的文本切碎。

这是我的文本文件中的数组。

MATCH (p:Person)-[:WROTE]->(m:Movie), (p2:Person)-[:WROTE]->(m2:Movie) 
RETURN p.name, m.title, p2.name, m2.title;

如果我需要以一行为例进行说明,

input => 65S34523APPLE BEAUTIFUL6.000TX786.34563.675 234.89

必填部分=> 65S34523 苹果非常漂亮 6.000 TX 786.345 63.67 5 234.89

我想要的目标:

Array
(
    [0] => 65S34523APPLE IS VERY BEAUTIFUL6.000TX786.34563.675 234.89
    [1] => 06W01232BOOK IS SUCCESSFUL1.000YJ160.00021.853 496.00
    [2] => 67E45643DO YOU HAVE A PEN? 7/56.450EQ9000.3451.432 765.12
)

我需要多个正则表达式模式来实现此目的。我需要按顺序将数据切碎。但是由于没有特定的布局,我不知道根据正则表达式模式选择什么。

我尝试了各种代码来粉碎该数组。

Array
    (
        [0] => 65S34523
        [1] => APPLE IS VERY BEAUTIFUL
        [2] => TX
        [3] => 786.345
    )

我正在尝试遍历和解析数组。例如,我尝试首先获取文本。

$smash = 
array('65S34523APPLE IS VERY BEAUTIFUL6.000TX786.34563.675 234.89', 
      '06W01232BOOK IS SUCCESSFUL1.000YJ160.00021.853 496.00',
      '67E45643DO YOU HAVE A PEN? 7/56.450EQ9000.3451.432 765.12');

事实证明就是那样。

foreach ($smash as $row) {
    $delete_numbers = preg_replace('/\d/', '', $smash);
}

echo "<pre>";
print_r($delete_numbers);
echo "</pre>";

自然地,这不是我想要的。每个数组都有不同的结构。所以我也必须检查if-else。

  

在示例中可以看到,没有纯文本。    TX YJ EQ 。应使用苹果擦拭。文字开头的字母应   被删除。其余的特殊字符必须被删除。

我已经尝试了以上许多方法,还研究了其他示例。

结果

我快要死了。

1 个答案:

答案 0 :(得分:0)

代码:(Demo

$smash = ['65S34523APPLE IS VERY BEAUTIFUL6.000TX786.34563.675 234.89', 
          '06W01232BOOK IS SUCCESSFUL1.000YJ160.00021.853 496.00',
          '67E45643DO YOU HAVE A PEN? 7/56.450EQ9000.3451.432 765.12'];

foreach ($smash as $line) {
    $result[] = preg_match('~(\w+\d)(\D+)[^A-Z]+([A-Z]{2})(\d+\.\d{3})~', $line, $out) ? array_slice($out, 1) : [];
}
var_export($result);

输出:

array (
  0 => 
  array (
    0 => '65S34523',
    1 => 'APPLE IS VERY BEAUTIFUL',
    2 => 'TX',
    3 => '786.345',
  ),
  1 => 
  array (
    0 => '06W01232',
    1 => 'BOOK IS SUCCESSFUL',
    2 => 'YJ',
    3 => '160.000',
  ),
  2 => 
  array (
    0 => '67E45643',
    1 => 'DO YOU HAVE A PEN? ',
    2 => 'EQ',
    3 => '9000.345',
  ),
)

我的模式假设:

  1. 第一组将由数字和字母组成,并以数字结尾。
  2. 第二组不包含数字。
  3. 第三组始终是2个大写字母。
  4. 第四组将可靠地保持小数点后三位。

p.s。如果您不希望在PEN?之后添加讨厌的结尾空格,可以使用以下方法:

https://3v4l.org/9XpA6

~(\w+\d)([^\d ]+(?: [^\d ]+)*) ?[^A-Z]+([A-Z]{2})(\d+\.\d{3})~