我正在使用 PSPad,需要一个正则表达式,可以在六个数字集中找到 4 个数字



我有以下格式的数据页面:

{1,2,3,4,5,6} {1,3,4,5,6,7} {1,2,4,5,6,7}

{1,2,3,5,6,7}

为了澄清起见,我将把 {} 包围的 6 个逗号分隔数字的每个实例称为"单词"。

所以在上面的例子中,{1,2,3,4,5,6} 将是一个单词。

所以我要做的是找到每个包含我选择的 4 个数字的单词。例如,在上面的示例中,我想找到包含数字 1、2、6 和 7 的所有单词。这里的关键点是 AND。我知道如何找到 1、2、6 或 7 - 我需要 AND。如果可能的话,我想替换整个单词,但如果它只是找到数字,我可以用另一个正则表达式删除单词的剩余 2 个数字。

有关我的数据的更多信息:数字范围从 1 到 25。(所以我需要能够找到 1 的东西,不一定包括数字 21、10-19 或 2,不包括 12 或 20-25。一个单词中永远不会重复一个数字。单词中的数字始终按从最低 (1) 到最高 (25) 的顺序排列。

更新:

您告诉正在使用PSPad并希望在编辑器中执行此操作。我认为使用正则表达式是不可能的。我会使用awk或您选择的编程语言。


下面是一个使用 awk 的示例:

awk '{for(i=1;i<=NF;i++)if($i~/y1y/&&$i~/y2y/&&$i~/y6y/&&$i~/y7y/)$i=""}1' input.txt

解释:

for循环遍历一行的所有字段,if条件检查该字段是否与所有必需的数字匹配。如果它匹配所有数字,则字段将被截断。以下1是用于打印由输出分隔符(默认情况下为输入分隔符)分隔的所有字段的awk习惯用法。

关于数字匹配,我在数字之前和之后使用转义序列y

$i~/y1y/

y匹配一个单词边界,在这种情况下,该边界要么{ ,要么是结束},以确保上面的模式仅匹配1,而不匹配11例如。

输出:

{1,2,3,4,5,6} {1,3,4,5,6,7}

顺便说一句,如果您将上面的脚本保存到文件中,则可以更具可读性和可维护性:

删除.awk

# Applies to every line of input
{
    for(i=1;i<=NF;i++) {
        # Check whether the field matches all required numbers
        if( 
                $i~/y1y/ 
            &&  $i~/y2y/ 
            &&  $i~/y6y/ 
            &&  $i~/y7y/ 
        ) {
            # Truncate field
            $i=""
        }
    }   
    # Print the modified line
    print
}

您可以像这样调用脚本:

awk -f remove.awk input.txt

相关内容

最新更新