【问题标题】:Regex - skip over expressions and parse the rest正则表达式 - 跳过表达式并解析其余部分
【发布时间】:2018-03-20 12:14:54
【问题描述】:

我使用正则表达式将数据分组。这些线条看起来有点像:

    testword test 
    test testword
    tes.w. tes.
    tes tes.w.
    tes.w othertexttobefound
    sometexttobefound testword somemoretextwhichdoesnotmatter

test 这个词与othertexttobefoundsometexttobefound 一样被发现。

现在我试图告诉我的解析器,它应该在搜索时直接忽略testword 及其派生词,并专注于我的其余数据条目。 “好词”和“坏词”可以在每一行的任何位置。

我已经尝试过[^w],它适用于字符串的开头,但在我的版本中不适用于其他情况。 (?:w) 也没有成功。我不能使用环视,因为它们会阻止检测到整条线。

在互联网上经过长时间的搜索后,我希望在这里得到帮助!

在得到 Naxos84 的大力帮助后,我添加了一些德国现实生活中的例子:

sozialabgabe sozialarbeiter
soz.abg. sozialarbeiter
sozarbeiter soz.abg.
sozialarbeiter otherirrelevantstuff
otherirrelevantstuff soz abg
otherirrelevantstuff sozabg
otherirrelevantstuff sozialabgabe

如果我搜索:

sozial["^\ab"]|soz["^\ab"]|sometexttobefound|othertexttobefound

第 6 行和第 7 行也被标记,但我不想要这些。

我做错了什么?

链接: regexr

【问题讨论】:

  • 您说的是 Perl 程序还是 PCRE Perl 正则表达式引擎?
  • 要匹配整个单词,请使用\b 作为单词边界。示例:/\btest\b/ 将匹配“test”,但不匹配“testword”或“wordtest”或“wordtestword”。单词边界可能出现在行首和行尾。
  • @simbabque,没有“PCRE Perl 正则表达式引擎”这样的东西。我认为您的意思是“PCRE 正则表达式引擎”。
  • @ikegami 我做到了。不知道那个多余的词是从哪里来的。
  • 我在 SAS 中使用正则表达式。我只知道它似乎是基于 Perl 的,但细节是我无法企及的。

标签: regex perl


【解决方案1】:

要查找您想要的所有匹配项:任何出现“test”、“sometexttobefound”和“othertexttobefound”,您可以尝试以下正则表达式:

test[^\w]|sometexttobefound|othertexttobefound

这个正则表达式的意思是:
找到每个 not 后跟一个单词 OR sometexttobefound OR othertexttobefound 的“测试”

我用以下文本尝试了这个正则表达式(我添加了一些“测试”)

testword test 
test testword
tes.w. testtes.
tes tes.w. test
tes.w othertexttobefound
sometexttobefound testword somemoretextwhichdoesnotmatter

regexr(使用全局标志时)

如果您还想查找“tes”之类的内容,我想您应该添加它。 (我不是正则表达式专家) 喜欢:

test[^\w]|tes[^\w]|sometexttobefound|othertexttobefound

【讨论】:

  • 我不确定这是评论还是试图回答。如果是答案,请edit 说得更清楚。为了方便起见,您可能还希望包含一个指向您已经设置模式的 regexr 的永久链接。
  • @simbabque 我试图让它更清楚。显然我无法与图片中显示的内容共享链接。
  • 蓝条右上角有一个分享链接。不是这样吗?
  • @simbabque 我找到了分享永久链接的方法。
  • 谢谢。但是,我怎样才能也找到test 的派生词(例如tes),例如第4 行中的第一个。如果我现在写tes[^w],它将找不到test。如果我写tes.?[^w]它会找到一切。
【解决方案2】:

如果您想从文本中获取除某些特殊单词之外的所有单词,您可以使用:

@words = grep{$_ ne 'testword'} split /\P{L}+/, $str;

(如果 $str 是您的完整字符串)

有关\P{...},请参阅perl docs。除了\P{L},您还可以使用\W,但这些取决于区域设置。

但如果你只需要使用正则表达式,那么你可以使用

@words = $str =~ /\b(?!testword)\p{L}+\b/g;

但同样,\b 再次依赖于语言环境,因此您可能希望使用\b{...} 或使用\p{L} 重建单词边界匹配:

@words = $str =~ /
  (?:(?<=\p{L})(?!\p{L})|(?<!\p{L})(?=\p{L}))
  (?!testword)\p{L}+
  (?:(?<=\p{L})(?!\p{L})|(?<!\p{L})(?=\p{L}))
/gx;

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多