【问题标题】:Replace hashtags in a single pass with regex用正则表达式一次性替换主题标签
【发布时间】:2017-12-02 05:11:51
【问题描述】:

我想用 Java 中的等效标签替换字符串中的所有主题标签。例子:

This is a #foo_bar #document about #nothing_but_tags!

将导致:

This is a foo bar document about nothing but tags!

这可能在 一次性 正则表达式替换中实现吗?一个标签可能包含许多单词。

【问题讨论】:

  • 规则是什么?删除哈希并用空格替换下划线?还有什么?
  • 是的,没有更多的规则!
  • 什么是“等价标签”?
  • 从我认为的例子中很明显。

标签: java regex hashtag


【解决方案1】:

这是一种通过小技巧来做到这一点的方法:

String str = "#This is a #foo_bar #document about #nothing_but_tags!";
String res = str.replaceAll(" ?#|(?<=#\\w{0,100})_", " ").trim();

它会因超过 100 个字符的主题标签而中断,并且如果它恰好是字符串中的第一个元素(因此调用 trim()),它会在标签中插入一个空格来代替 hash。

Demo.

100 个字符的限制来自lookbehind 的{0,100} 部分。这是 Java regex 引擎的一个限制:与其他一些 regex 引擎不同,它要求look-aneads 和look-behinds 的长度有一个明确的上限。

【讨论】:

  • 感谢您的回答。你能解释一下前瞻的工作原理吗?
  • @Mohsen 这个结构(?&lt;=#\\w{0,100})_ 表示“下划线”(在末尾)前面是= 之后的括号中的内容,即#\\w{0,100},表示“一个标签和最多100 个单词字符”。但是,这些都没有被捕获:正则表达式引擎将它们验证为匹配的先决条件,但只有下划线真正匹配。这里是a link to my favorite tutorial on lookaheads and lookbehinds
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多