如何使我的正则表达式匹配我的文本中的任何类型的 str [重复]

Posted

技术标签:

【中文标题】如何使我的正则表达式匹配我的文本中的任何类型的 str [重复]【英文标题】:How to make my regex match any kind of str in my text [duplicate] 【发布时间】:2019-12-15 07:18:20 【问题描述】:

对于 reactJs 中的一个副项目,我想做一些非常特别的事情。 假设您在 div 中有这样的文本:

“你好世界(这是一个测试)你能帮我吗?你会是我的天使

我的用户可以选择文本,就像您选择要复制的文本一样。 但是我的文字旁边有一个按钮。如果您选择文本的一部分并单击它,则该部分文本将带有下划线。清楚吗 ? :)

所以现在这是我的问题。实际上它工作得很好,但是当我选择一个更大的文本(超过 3 行)或者如果文本中没有右括号时,我的网站崩溃了。

她是我的代码:

function underligne(text, selectedText) 
   const termRegex = new RegExp(`($selectedText)(?=[^>]*<)`, "gi");
   return text.replace(termRegex, "<span style='background-color:#3fff3d'>$1</span>");


正如我所说,它工作正常,但如果 selectedText 像这样,正则表达式会崩溃:

(it's a test

(it's a test)

或者如果 selectedText 长于大约 3 行

所以我尝试删除正则表达式并制作一个大循环,但它一点也不好。 我尝试了不同类型的正则表达式,但我总是遇到与未闭合括号相同的问题。

我唯一想要的就是在文本中每一次出现的 selectedText 下划线。无论 selectedText 的大小或其中的字符如何。

顺便说一句,对不起我的英语,我尽力消除拼写错误

编辑: 请最后一个问题:) 我想改进 escapeRegExp 以逃避 &lt;br&gt; 标签我该怎么做? 我试过这个

function escapeRegExp(string) 
  return string.replace(/<br ?\/?>[.*+?^$()|[\]\\]/g, '\\$&'); 

或者这个:

function escapeRegExp(string) 
  return string.replace(/[.*+?^$()|[\]\\](<br ?\/?>)/g, '\\$&'); 

但没有成功:/

【问题讨论】:

我认为您需要先转义所选文本,然后才能在正则表达式上使用它,这是一个相关的帖子:***.com/questions/3446170/… 顺便说一句,我将 更改为 的样式以避免粗体效果。因为我试图用 windows.getSelection 找到所选文本下划线的文本中的位置 【参考方案1】:

function underligne(text, selectedText) 
  selectedText = selectedText.replace('(', '\\(').replace(')', '\\)');

  var termRegex = new RegExp(`($selectedText)(?=[^>]*<)`, "gi");
  return text.replace(termRegex, "<span style='background-color:#3fff3d'>$1</span>");



underligne("Hello world (it's a test) can you help me (it's a test) ? you will be my angel <3  text ", "(it's a test)")

【讨论】:

【参考方案2】:

在将输入用户中的正则表达式特殊字符应用到正则表达式之前,您需要对其进行转义。 Mozilla documentation 有一个内置函数来处理这个问题:

function escapeRegExp(string) 
  return string.replace(/[.*+?^$()|[\]\\]/g, '\\$&'); // $& means the whole matched string

在创建正则表达式之前调用它:

const termRegex = new RegExp(`($escapeRegExp(selectedText))(?=[^>]*<)`, "gi");

【讨论】:

非常感谢,它真的很有帮助!

以上是关于如何使我的正则表达式匹配我的文本中的任何类型的 str [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式匹配四个数字字段或文本字符串

python 正则表达式

猪中的正则表达式匹配

如何安全地使用用户输入的正则表达式?

正则表达式如何匹配多行的所有任意字符

如何忽略正则表达式主题字符串中的空格?