Regex请帮我从内容中找到单词

wvyml7n5  于 2023-05-19  发布在  其他
关注(0)|答案(4)|浏览(122)

我的文字如下:

9/91 a1 2a cx.papaya 94000
9/92 b2 3a x44b mango 10220
9/93 3 3a x333 pineapple
9/94 x4 cx.apple 94000
9/95 5 55 cyz cx.orange

我试着开发一个正则表达式来找出下面的单词表,但它不工作。
正则表达式是^[0-9\/]+.*\s(.*)\s(\d{5})$
这是我的期望:
| 第1组|第二组|第三组|
| --------------|--------------|--------------|
| 9/91 a1 2a|木瓜|九万四千|
| 9/92 b2 3a x44b|芒果|10220|
| 9/93 3 3a x333|菠萝||
| 9/94 x4|苹果|九万四千|
| 9/95 5 55 cyz|橙子||

4xy9mtcn

4xy9mtcn1#

以下是我的尝试:

^(\d+\/\d+\hx\d+)\h(?:\w+\.)?(\w+)\h?(\d+)?$

演示:regex101

说明:

  • ^:启动锚
  • (\d+\/\d+\hx\d+):第一捕获组,匹配模式9/91 x1(一个或多个数字\d+,带转义字符的斜杠\/,一个或多个数字\d+,空格\h,字符x,一个或多个数字\d+
  • \h(?:\w+\.)?:一个空格\h,后跟一个非捕获组,匹配可选模式cx.
  • (\w+):第二个捕获组,匹配任意单词字符\w+一次或多次
  • \h?(\d+)?第三个捕获组(可选),可选空格\h?,可选捕获组(\d+)?
  • $:端锚
    **更新:**OP改变了他们的问题,所以这是我的新尝试:

感谢第四只鸟在第三个捕捉组中删除尾随空格

^(\d+\/\d+(?:\h\w+)+)\h(?:\w+\.)?([a-zA-Z]+)(?:\h(\d+))?$

演示:regex101

  • 我将(?:\h\w+)+添加到第一个捕获组中,以匹配9/91模式后的a1 2a等多个字符组
  • 我将第二个捕获组从\w+更改为[a-zA-Z]+,以便只匹配单词字符。
igetnqfo

igetnqfo2#

您忘记了为第一个部分创建一个组并说明x序列。您还应该将最后一部分设置为可选的,并在第二部分中说明前导可选前缀。这些更改的结果可能如下所示:

^([0-9\/]+ x\d) (?:\w+\.)?(\w+)(?: (\d{5}))?$

您可以添加惰性组(?: \w+)+?,以反映更改后问题中第一个组的附加尾随序列:

^([0-9\/]+(?: \w+)+?) (?:\w+\.)?(\w+)(?: (\d{5}))?$
km0tfn4u

km0tfn4u3#

既然你也标记了php,我将为你的问题提供一个没有正则表达式的php解决方案,所以你也可以检查它作为替代方案。

<?php
$input = '9/93 3 3a x333 pineapple';

$splitter = explode(' ',$input);

$maxArrayPositions = array_key_last($splitter);

$group3 = '';
$group1 = '';
if(is_numeric(end($splitter))){
    $group3 = end($splitter);
    $fruit = explode('.',$splitter[$maxArrayPositions-1]);
    $group2 = end($fruit);
    $counter = 0;
    while($counter < $maxArrayPositions -1){
        $group1 = $group1. ' ' .$splitter[$counter];
        $counter ++;
    }
}
else{
    $fruit = explode('.',end($splitter));
    $group2 = end($fruit);
    $counter = 0;
    while($counter < $maxArrayPositions){
        $group1 = $group1. ' ' .$splitter[$counter];
        $counter ++;
    }
}

    
echo 'group 1 is '. $group1. "\n";
echo 'group 2 is '. $group2. "\n";
echo 'group 3 is '. $group3. "\n";

group变量的输出与预期的一样。
基本上你的弦有一个模式。

  • 最后一列是可选的,可以是数字或空
  • before-last列是你的水果有或没有前缀,但你只需要最后一个点之后的部分
  • 在半最后一列之前的所有内容都是连接的字符串。

希望对你有帮助。
(根据您问题中的最新输入更改更新了我的答案)

4ioopgfo

4ioopgfo4#

这样的东西可能会有所帮助:

(\d\/\d+\s.\d).+(papaya) ?(\d+)?

你可以尝试在一些站点上使用regexp,比如https://regex101.com/

相关问题