JavaScript匹配用户选择的整个字符串,跳过电子邮件和URL
我尝试使用正则表达式匹配段落中的整个字符串(用户选择,可以是一个单词或多个单词)JavaScript匹配用户选择的整个字符串,跳过电子邮件和URL,javascript,regex,match,Javascript,Regex,Match,我尝试使用正则表达式匹配段落中的整个字符串(用户选择,可以是一个单词或多个单词) var str = 'myname this is my myname 18 my email is MyName@email.com 40 another email is support@MYNAME.com.au. 78 and my site is www.myname.com.au. 119 myname. 142 ..myname 154 [myname] 167 and myname\'s 184 m
var str = 'myname this is my myname 18 my email is MyName@email.com 40 another email is support@MYNAME.com.au. 78 and my site is www.myname.com.au. 119 myname. 142 ..myname 154 [myname] 167 and myname\'s 184 mynamebefore 198 aftermynames 215 "myname" 231 \'myname\' 244 lastmyname';
function match(text, str) {
//need to change
var pattern = '(?=^|\\s|\\b)(' + text + ')(?=$|\\s|\\b)';
var regexp = new RegExp(pattern, "ig");
var idx = 0;
while ((match = regexp.exec(str)) != null) {
var offsetStart = parseInt(match.index);
console.log("--["+idx+"] ["+offsetStart+"]- textnode " + JSON.stringify(match, null, ' '));
idx++;
}
}
var selectText = 'myname';
match(selectText, str);
我想看到的是,下面的字符串已在字符串中突出显示
“myname这是我的myname18我的电子邮件是MyName@email.com40另一封电子邮件是support@MYNAME.com.au. 78我的网站是www.myname.com.au。119myname。142.myname154[myname]167和myname\'s 184 myname在198个myname之后215“myname“231”myname\'244 lastmyname'
跳过电子邮件,跳过URL,返回已匹配的字符串,该字符串可以用空格或任何其他字符[^a-zA-Z0-9]包装,如[]、''、或''s
所有文本都是粗体的,如myname将返回。首先使用regexp
“[^@.]”“+text+”[^@.]”匹配字符串。
然后按代码forEach
中所示的每个项目
然后返回字符串
检查代码段
var str='myname这是我的名字18我的电子邮件是MyName@email.com40另一封电子邮件是support@MYNAME.com.au. 78我的网站是www.myname.com.au。119我的名字。142..myname 154[myname]167和myname的184 myname在myname之前198之后215“myname”231“myname\'244 myname';
函数匹配(文本,str){
var re=new RegExp(“([^@a-zA-Z0-9]|^)”+text+”(\.\s|[^@a-zA-Z0-9.]),“igm”);
str.match(re).forEach(函数(i,p){
str=str.replace(i,“+i+”);
});
返回str;
}
var selectText='myname';
document.writeln(“在
”之前+str);
document.write(“
”后加上匹配(selectText,str))
您可以使用拆分联接来首先分离潜在的候选项,但这需要捕获异常,例如在网站中使用
时,因此想法是首先将
作为拆分字符排除,然后根据其他规则检查每个项目是否应包含它(例如,如果按
进一步拆分,则包含名称
,但不包含www
)
例如:
const text = 'myname this is my myname ...';
const name = 'myname';
// used to check if a found value is indeed ok, excludes e.g. www. texts but keeps things like '..name'; can be customized and improved to better fit the case
const check = val => val === name ||
(val.split(/\./).some(_ => _ === name) && !val.split(/\./).some(_ => _ === 'www')) ;
const res = text
.split(/([^a-zA-Z0-9\.])/)
.map(val => check(val) ? `<b>${val}</b>` : val)
.join('');
const text='myname这是我的名字…';
常量名称='myname';
//用于检查找到的值是否正确,排除例如www.text,但保留诸如“…name”之类的内容;可以自定义和改进以更好地适应情况
常量检查=val=>val==name ||
(val.split(/\./)。一些(\=>\==name)和&!val.split(/\./)。一些(\=>\==www');
常量res=文本
.拆分(/([^a-zA-Z0-9\.])/)
.map(val=>check(val)`${val}`:val)
.加入(“”);
这适用于您当前的场景,可能已经足够好了
希望这有帮助。使用空格或任何类似于[]、''、或的非字符进行换行。您确定这些字符将是唯一用于换行的字符吗?是否应该使用任何其他字符[^a-zA-Z0-9]