Grep 格雷普:如何只找到一行文字中提到的第一个价格

Grep 格雷普:如何只找到一行文字中提到的第一个价格,grep,adobe-indesign,grep-indesign,Grep,Adobe Indesign,Grep Indesign,我有一堆Adobe Indesign中的可变文本,我希望每行文本中第一个提到的价格有另一种颜色。我对正则表达式完全陌生,因此陷入了困境。 我使用下面的grep查找价格,但它查找的是文本中提到的所有价格 [0-9]+([,][0-9]+)* 文本如下所示,我只需要获得粗体的价格: 花费99.99欧元,享受25欧元优惠 花费150欧元,享受35欧元优惠 我尝试了很多在stack overflow和online上提到的东西,但就是找不到正确的解决方案。添加?最后,让它变得懒惰并不能奏效。我想我需要对g

我有一堆Adobe Indesign中的可变文本,我希望每行文本中第一个提到的价格有另一种颜色。我对正则表达式完全陌生,因此陷入了困境。 我使用下面的grep查找价格,但它查找的是文本中提到的所有价格

[0-9]+([,][0-9]+)*

文本如下所示,我只需要获得粗体的价格:

花费99.99欧元,享受25欧元优惠

花费150欧元,享受35欧元优惠

我尝试了很多在stack overflow和online上提到的东西,但就是找不到正确的解决方案。添加?最后,让它变得懒惰并不能奏效。我想我需要对grep代码进行一些分组,但找不到正确的方法。任何帮助都会很好

  • 创建两种字符样式“粗体”和“罗马”,后者应与段落样式中的字符样式相同

  • 创建两个GREP样式。第一种应将字符样式“粗体”应用于具有以下模式的文本:

    ^.*?(€\d+(?:,\d+)*)
    
    ^.*?(?=€)
    
    第二种应将字符样式“Roman”应用于具有以下模式的文本:

    ^.*?(€\d+(?:,\d+)*)
    
    ^.*?(?=€)
    
  • 创建两种字符样式“粗体”和“罗马”,后者应与段落样式中的字符样式相同

  • 创建两个GREP样式。第一种应将字符样式“粗体”应用于具有以下模式的文本:

    ^.*?(€\d+(?:,\d+)*)
    
    ^.*?(?=€)
    
    第二种应将字符样式“Roman”应用于具有以下模式的文本:

    ^.*?(€\d+(?:,\d+)*)
    
    ^.*?(?=€)
    

  • 您可以使用代码
    \K
    从头开始重置匹配。这项工作:

    ^[^€]*\K€\d+([.,]\d+)*
    
    因为它首先匹配第一次出现的
    ,然后忘记刚刚匹配的内容,然后只匹配欧元符号和下一个金额


    您可以使用代码
    \K
    从头开始重置匹配。这项工作:

    ^[^€]*\K€\d+([.,]\d+)*
    
    因为它首先匹配第一次出现的
    ,然后忘记刚刚匹配的内容,然后只匹配欧元符号和下一个金额



    不确定是否支持,但您可以使用非贪婪量词并从第一个捕获组获取值
    ^.*(€[0-9]+(?:[,][0-9]+)*)
    Thnx 4thBird,它很接近,但建议的代码也会选择第一个价格前面的所有内容。(像这样:花99.99欧元,打25欧元)。它匹配所有东西,但你要寻找的价值在第一组中。也许你可以用
    \1
    $1
    来引用它,而不是做一大堆的搜索,你可能想看看GREP样式第四只鸟:我(还)不知道在表达式中哪里添加它。不确定它是否受支持,但你可以使用一个非贪婪的量词,从第一个捕获组中获取值
    ^.*()[0-9]+(?:[,][0-9]+)*)
    Thnx 4thBird,它很接近,但建议的代码也会选择第一个价格前面的所有东西。(如:花费99,99欧元,获得25欧元优惠)。它匹配所有内容,但您要查找的值在第一个捕获组中。也许您可以使用
    \1
    $1
    来引用它,而不是进行一系列搜索,您可能希望查看GREP样式第四只鸟:我不(还没有)知道在表达式中添加该选项的位置。感谢nomad,出于某种原因,它在这里不起作用(我确实注意到第一个模式中缺少括号,所以不是这样-顺便说一下,在您的屏幕截图中是好的)。当我添加第一个模式时,它会选择第一个值之前的所有内容。当添加第二个模式时,它会选择第一个值之前的所有内容,包括第一个值和值后的第一个单词。当我有更多时间时,我会开始一个新文档并重试。@Mackie:你一定忘了调整字符样式。T第一种样式的行为完全是“精心设计的”;第二种样式是用罗马(或常规、中号或其他任何样式)样式再次覆盖粗体文本。@usr2564301我相信拼写错误现在已经修复,感谢您出于好奇才发现它:您是否也尝试过
    ^[^€]*\K.
    应该在哪里重置匹配?感谢cybernetic.nomad和usr2564301。我创建了一个新文档,这正是我要找的。效果非常好。谢谢!感谢nomad,出于某种原因,它在这里不起作用(我确实注意到第一个图案中缺少括号,所以不是这样-顺便说一句,在你的截图中是好的)。当我添加第一个模式时,它会选择第一个值之前的所有内容。当添加第二个模式时,它会选择第一个值之前的所有内容,包括第一个值和值后的第一个单词。当我有更多时间时,我会开始一个新文档并重试。@Mackie:你一定忘了调整字符样式。T第一种样式的行为完全是“精心设计的”;第二种样式是用罗马(或常规、中号或其他任何样式)样式再次覆盖粗体文本。@usr2564301我相信拼写错误现在已经修复,感谢您出于好奇才发现它:您是否也尝试过
    ^[^€]*\K.
    应该在哪里重置匹配?谢谢cybernetic.nomad和usr2564301。我创建了一个新文档,这就是我要找的。效果很好。谢谢!这很有效,但在下面的段落中找不到第一个价格。不过谢谢你的回答。从这个案例中学到了很多。@Mackie:n您的段落没有用硬回车分隔,但您使用的是移位回车。出于各种原因(这是一个原因),请不要这样做。我检查了一下,您是对的。问题是,我们使用的是个性化软件,文本被导入(并输出)直接从excel工作表中获取,其中客户使用了这些shift-/软返回(excel中的alt return)而不是硬返回。我想硬返回不是