Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript匹配用户选择的整个字符串,跳过电子邮件和URL_Javascript_Regex_Match - Fatal编程技术网

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]