【问题标题】:Extract uppercase words with optional numbers and underscore characters提取带有可选数字和下划线字符的大写单词
【发布时间】:2013-10-05 17:52:41
【问题描述】:

我是 Perl 新手,需要一些 Perl 正则表达式帮助。我想从只能包含大写字符和/或数字数字和下划线字符(在单词的开头或结尾或中间)的文件中提取 words。单词的分隔符可以是空格或任何其他非大写、非数字、非下划线。

3 个例子:

abcd _PARAM123="dfd"; (I want to extract _PARAM123)
abcd PARAM2_:12; (I want to extract PARAM2_)
abcd PARA_M-1; (I want to extract PARA_M)

【问题讨论】:

  • 是否需要支持 UTF8,码位在 127 以上?
  • @Jerry - 我是一名硬件工程师,正在学习 Perl 来解析我的日志等。我是一个新手,因为我还没有超越数组、散列和简单的替换。我在网上搜索“字符串提取”,但没有取得太大进展,发现正则表达式非常令人费解(我尝试了很多听起来太愚蠢且无法列出的东西);所以我想要一些帮助来快速解决我的问题并按照我自己的节奏学习;所以这个问题。谢谢
  • 好的,当然。你能提供更多的样品吗? abcd 1PARAM_T=3 呢,要提取1PARAM_T 吗?或者如果你有abcd PARAM=PARAM2 怎么办?
  • @DavidO - 我不需要支持 UTF-8
  • @Jerry - 也是第二种情况。任何包含下划线和数字并由其他任何内容分隔的 UC 单词

标签: regex perl


【解决方案1】:

你可以

my @words = $str =~ /( [A-Z_] [0-9A-Z_]+ )/xg;

【讨论】:

  • 杰瑞:是的,我做出这样的假设是因为这似乎是 OP 可能刚刚忘记提及的事情。我不相信规范,所以我不会写一个包含变体的答案来解决问题的每一个可能的解释。 :) 但我会收回我的暗示,因为我只是在猜测真正的规格。
  • @DavidO 我知道,只是指出来。我认为在 OP 完全清楚之前,不应回答此类问题。
  • 我们仍然不知道他认为大写是什么:他是否需要支持高于 127 的代码点?
  • 好的,“其他正则表达式”:m/([A-Z_][A-Z0-9_]*)/g,因为标识符几乎总是必须以 alpha 或下划线开头。
  • 谢谢大家!该模式甚至在小写字符之间提取“下划线”,例如“abcd_param”返回“_”,但我可以搜索替换这些东西。有人可以告诉我'+'符号和')'之前的'*'符号之间的区别
【解决方案2】:

由于您还没有回复我的上一个查询,我将假设一个单词如果只有数字(和/或下划线)则不算作一个单词,例如 121_2不被视为单词。

在这种情况下,我建议使用这个正则表达式:

(?=[0-9_]*[A-Z])\b[A-Z0-9_]+\b

regex101 demo

(?=[A-Z0-9_]*[A-Z]) 是一个积极的前瞻,并确保正则表达式中至少有一个大写字符。如果您将1_2 视为一个词,请改用(?=[A-Z0-9_]*[A-Z_])

\b 是一个单词边界,可确保您要查找的单词没有附加小写字符。

[A-Z0-9_] 是一个字符类,将匹配A-Z(大写字母)、0-9(数字)和下划线范围内的任何字符。

+ 表示上一个组或字符可以出现 1 次或多次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多