【问题标题】:Regex: Searching for words with '%' at the beginning正则表达式:搜索以 '%' 开头的单词
【发布时间】:2012-02-14 07:31:30
【问题描述】:

我一直在尝试自己解决这个问题,但恐怕正则表达式不是我的菜。在此示例字符串中:“我的名字是 %name,我住在 $address。” 我正在尝试获取以 “%” 开头的单词,然后替换它们它们的值在$name 或$address 中,具体取决于在正则表达式中找到的单词。然后返回完整的带有替换值的新字符串。

不应返回诸如: aaa%aaa(% 不是第一个字符)和 \%word(% 是转义)

这是在 PHP 中。 我正在使用它,因为我从 *.ini 文件中获取数据,其中所有内容都是字符串。我删除了 $_POST 示例,以免产生误导。

【问题讨论】:

  • 你还没有定义一个“词”。您没有在标签集中包含您正在使用的编程语言或库。您的问题在书面上无法回答。
  • 我假设是 PHP 但为什么你需要使用正则表达式来匹配这个?我认为如果我没看错的话,一个简单的字符串 concat 会更容易。能否请您澄清一下您的问题。
  • 什么是该死的词? “不应该”是一个词吗? “不应该”怎么说? “MᶜKinley”是一个词吗? “心软”是一个词吗? “niño”是一个词吗? “立面”呢? “外部界限”是一个词吗? “_________”是一个词吗? “3.14159”是一个词吗? “π”是一个词吗? “1/2”是一个词吗? Qu'est-ce que c'est qu'un word? 有求知欲的人想知道。
  • 这句话有五个字。一个单词是连续的字符,后面跟一个空格,就像在任何编程语言中一样:)
  • @Thecrocodilehunter:那么字符串""""""" 是一个词,根据你的定义。

标签: regex


【解决方案1】:

这个应该没问题:

(?<!\\|\w)%\w+

但是,在显示/其他内容之前不清理 $_POST/$_GET 通常是一件坏事。

【讨论】:

  • 这实际上不允许转义转义。 \\%test 不会通过,%%test 会通过。但是,OP 可能没问题。
  • 哦,对了。这根本不允许 \\%test 或 %%test 。
  • @sln/enchance:是的,忘记提了。请随意接受 nlp 的回答,我将删除这个。
【解决方案2】:

在 javascript 或类似的 REGEX 引擎中,您可以使用:

\B(%\w+)\b

编辑:
在这种情况下,最后的\b 是可选的,因为\w 将匹配所有需要的字符并停止在@tchrist 指出的任何非单词字符中。

编辑 2: 这将不匹配 \%name:

(?:^|\s)(%\w+)

【讨论】:

  • 最后的\b到底是为了什么?
  • 字边界。由于多字规范,在这种情况下是可选的。感谢您指出。我将对我的答案进行编辑。
【解决方案3】:

这看起来可能有效。这个对齐甚至逃逸。 -

(?&lt;!\\)(?:\\.)*(?&lt;![%\w])%(\w+)

扩展 -

(?<!\\)     # Not an escape behind us
(?:\\.)*    # 0 or many esc plus anything
(?<![%\w])  # not % nor \w behind us
%(\w+)      # % then capture grp1 bunch of word chars

【讨论】:

    【解决方案4】:

    这样的东西会很有帮助。

    $string = "Hello %name from %city ";
    
    $name = "Joe";
    $city = "Boston";
    $array = array();
    
    
    preg_match("/%\w+/",$string,$array);
    
    foreach($array as $string1)
                   echo "match: ".$string1;
    

    【讨论】:

    • 不能正确处理\%please \%don't \%switch \%these。
    • 这将匹配anythingHere%anyOtherThing。
    • 这不是完美的解决方案,只是一个开始。你的评论是正确的
    猜你喜欢
    • 2012-02-23
    • 2018-02-21
    • 2011-01-24
    • 1970-01-01
    • 2013-11-23
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多