【问题标题】:Regex Find and Replace: Deleting everything except words starting with "#"?正则表达式查找和替换:删除除以“#”开头的单词之外的所有内容?
【发布时间】:2023-03-13 23:45:01
【问题描述】:

我是 regex 的新手,无法找到轻松做到这一点的方法。我想删除不以 # 开头的每个单词,并在它们之间加一个逗号,例如,如果我有:

Cookie Recipe for n00bs
#cookie #recipe #chocolate To do this you have to etc...
Bla bla bla mumbo jumbo

我想得到一个结果:

cookie, recipe, chocolate

如果你能帮助我,那就太好了,谢谢,祝你有美好的一天!

【问题讨论】:

  • 不是删除所有不以#开头的单词,为什么不尝试匹配以#开头的单词?
  • 你使用什么语言/工具?
  • 我正在尝试在查找和替换上下文中使用它。我正在创建一个键盘大师宏,它按照此查找和替换规则过滤剪贴板。我不知道只复制匹配的 Find 的方法。

标签: regex keyboard-maestro


【解决方案1】:

您错过了告诉您正在使用哪种编程语言。下面是一个 PHP 示例,它使用 perl 兼容的正则表达式:

$text = <<<EOF
Cookie Recipe for n00bs
#cookie #recipe #chocolate To do this you have to etc...
Bla bla bla mumbo jumbo
EOF;

$pattern = '/((?<=#)\w+)/';
preg_match_all($pattern, $text, $matches);

echo implode(', ', $matches[0]);

我正在使用所谓的肯定后向断言(?&lt;=#),它确保只匹配前面有# 的单词,但是这很重要,它不包括# 本身到匹配中.在lookbehind 表达式之后,我匹配尽可能多的单词字符\w。

之后,implode() 用于将结果匹配与, 连接起来。正则表达式不能用于该部分的工作。

你可以在Regex101.com看到这个正则表达式是如何工作的

【讨论】:

    【解决方案2】:

    试试这个:

    $re = "/#\\w+/";
    $str = "#cookie #recipe #chocolate To do this you have to etc...";
    $str .= "#cookie #recipe #chocolate To do this you have to etc...";
    
    preg_match_all($re, $str, $matches);
    $r=@implode(", ",@$matches[0]);  // for adding comma(,) and space( ).
    var_dump( $matches,$r);
    

    输出:

    array (size=1)
      0 => 
        array (size=6)
          0 => string '#cookie' (length=7)
          1 => string '#recipe' (length=7)
          2 => string '#chocolate' (length=10)
          3 => string '#cookie' (length=7)
          4 => string '#recipe' (length=7)
          5 => string '#chocolate' (length=10)
    
    string '#cookie, #recipe, #chocolate, #cookie, #recipe, #chocolate' (length=58)
    

    live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2019-11-12
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多