如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?

Posted

技术标签:

【中文标题】如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?【英文标题】:How to fetch second value in string based on the matched value before the delimeter "|"? 【发布时间】:2022-01-19 19:47:00 【问题描述】:

如何根据分隔符“|”前的匹配值获取字符串中的第二个值?

期望的输出:

12348888
113336669998888

基于搜索值:1254698

<?php

        $contents = '12345|BHKAHHHHkk
1254698|12348888
12345|BHKNe22223366
1254698|113336669998888
012250000|22154545488888';

    $searchfor = '1254698';
    
    if(preg_match('/(?:\n|^)' . $searchfor .  '\|([^|]+)(.*?)(?:\r?\n|$)/is', $contents, $matchs))
    
        $second_value = $matchs[1];
        $reset_values = $matchs[2];
        echo "Result for searching <b>$searchfor</b> is <b>$second_value</b> and reset of data is <b>$reset_values</b>";
    
    else echo('Not Found :(');
    
    ?>

【问题讨论】:

【参考方案1】:

你可以使用

<?php

$contents = '12345|BHKAHHHHkk
1254698|12348888
12345|BHKNe22223366
1254698|113336669998888
012250000|22154545488888';

$searchfor = '1254698';
    
if(preg_match_all('/^' . $searchfor .  '\|([^|\r\n]+)/m', $contents, $matchs))

    print_r($matchs[1]);
 else 
    echo('Not Found :(');

请参阅online PHP demo。输出:

Array
(
    [0] => 12348888
    [1] => 113336669998888
)

正则表达式是/^$searchfor\|([^|\r\n]+)/m,注意m 标志使^ 匹配任何行的开头。模式匹配

^ - 行首 $searchfor - 搜索到的值 \| - 文字 | char ([^|\r\n]+) - 除了|、CR 和 LF 字符之外的一个或多个字符。

请参阅 regex demo。此外,在 regex101.com 进行测试时,您始终可以使用

获取为您生成的代码的链接。

【讨论】:

【参考方案2】:

不要使用正则表达式,使用循环并在| 个字符处分割每一行。

$lines = file($input_file, FILE_IGNORE_NEW_LINE)
$found = false;
foreach ($lines as $line) 
    [$first_value, $second_value, $reset_values] = explode('|', $line, 3);
    if ($cols[0] == $searchfor) 
        echo "Result for searching <b>$searchfor</b> is <b>$second_value</b> and reset of data is <b>$reset_values</b>";
        $found = true;
    

if (!$found) 
    echo 'Not Found :(';

【讨论】:

感谢您的帮助。我尝试运行代码,但出现未定义的数组错误: [$first_value, $second_value, $reset_values] = explode('|', $line, 3); 你有空行吗?添加FILE_SKIP_EMPTY_LINES 标志。 什么版本的 PHP?你可能需要写list($first_value, $second_value, $reset_values) = ... 我使用的是 php 7.3 那么它可能是空行,添加那个标志:FILE_IGNORE_NEW_LINE | FILE_SKIP_EMPTY_LINES

以上是关于如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?的主要内容,如果未能解决你的问题,请参考以下文章

R中根据特定字符将一列拆分为几列的方法

如何根据两个逗号分隔值的列中的任何一个值获取记录

如何从 Erlang 中的对列表中获取元素

如何使用选择查询为每个唯一的第二个值获取一个值中的最小值?

Flutter:如何根据选择的第一个下拉按钮值设置第二个下拉按钮(多级相关按钮)的值?

shell中最强大,实用的命令awk