为什么当我使用“和”或“或”而不是我使用“&”或“ /”或“ +”时,替换在JavaScript中正常工作

时间:2019-06-25 08:08:50

标签: javascript regex

我用HTML格式输入了一个名字,有时用户会输入两个名字,我需要去除第二个名字以及用于连接它们的单词或字符。如果我使用单词“和”或单词“或”,则我的javascript效果很好,并去除了第二个名称和用于连接它们的单词。但是,如果我使用与号(&)或加号(+)或正斜杠(/),则无论我如何编码,它都只会去除姓氏的最后一个字符,而不去除连字符或除了最后一个字符,第二个名字都可以。

我尝试过使用字符串函数,正则表达式,在regex.com上测试我的正则表达式(它们在那里工作并正确选择单词和连接词),十二种不同的正则表达式变体都可以在regex上正常工作,com来选择我要删除的文本,但是这些都不能以我的实际形式工作。

例如,如果我输入: “鲍勃和戴夫”我得到“鲍勃”-正确 “鲍勃或戴夫”我得到“鲍勃”-正确

但是如果我输入: “ Bob&Dave”我得到了“ Bob&Dav”-错误 “ Bob + Dave”我得到了“ Bob + Dav”-错误 “鲍勃/戴夫”我得到“鲍勃”-不正确但可以接受 “鲍勃,戴夫”我得到“鲍勃,戴夫”-错误

这是我使用的一些代码,前两种使用了几种不同的方法,后四种则没有用。

适用于“鲍勃和戴夫”:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(\s)*\w+/gi)
var x = pattern.search("AND", z+1)
if (z < x) {
    alert('Please only enter ONLY ONE FIRST NAME')
    document.forms[0].first_name.focus();
    return document.forms[0].first_name.value=pattern.replace(/\s(AND)*\w+/gi, "");
}
}

适用于“鲍勃或戴夫”:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/\s(OR)*\w+/gi)
var x = pattern.search("OR", z+1)
if (z < x) {
    alert('Please only enter ONLY ONE FIRST NAME')
    document.forms[0].first_name.focus();
    return document.forms[0].first_name.value=pattern.replace(/\s(or)*\w+/gi, "");
}
}

这也适用于“鲍勃和戴夫”,而将相应的单词“和”改为“或”,适用于“鲍勃或戴夫”:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search("and")
var x = pattern.search("and")
if (z < x) {
    alert('Please only enter ONLY ONE FIRST NAME')
    document.forms[0].first_name.focus();
    return document.forms[0].first_name.value=pattern.slice(0, z);
}
}

但是,当替换了适当的字符时,此方法适用于不正确但可以接受的“鲍勃·戴夫”,但不适用于“鲍勃和戴夫”或“鲍勃/戴夫”:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(,\s+)/gi);
var x = pattern.search((/(,\s+)/gi), z-1);
if (z < x) {
    alert('Please only enter ONLY ONE FIRST NAME');
    document.forms[0].first_name.focus();
    return document.forms[0].first_name.value=pattern.replace(/(,\s+)/gi);
}
}

这会产生与“&”和“ /”相同的错误结果:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(\s&)/gi);
var x = pattern.search(/(\s&\s.[a-z].+)/gi, z-1);
if (x < z) {
    alert('Please only enter ONLY ONE FIRST NAME');
    document.forms[0].first_name.focus();
    return document.forms[0].first_name.value=pattern.replace(/(\s&\s.[a-z].+)/gi, "");
}
}

所有正则表达式都可以在regex.com上选择适当的文本,但是从不以我的形式工作,而且我简直是发疯了。

为什么会这样,更重要的是我该如何解决。我尝试了在此站点上找到的其他几种解决方案,例如:

function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(,\s+)/gi);
var x = pattern.search((/(,\s+)/gi), z-1);
if (x < z) {
    alert('Please only enter ONLY ONE FIRST NAME');
    document.forms[0].first_name.focus();
    var s = document.forms[0].first_name.value;
    var n = s.indexOf('&');
    s = s.substring(0, n != -1 & n : s.length);
    return document.forms[0].first_name.value = s;
}
}

一切都不高兴。

预期输出为:Bob 实际输出为:Bob&Dav

2 个答案:

答案 0 :(得分:0)

通过分割正则表达式并返回第一个项目,似乎可以更好地解决此问题。这种模式应该照顾您的帖子中提到的情况:

var pattern = /(\s*[\+|&|\,|\/]\s*|\s+(and|or)\s+)/i;

然后拆分并始终返回第一个元素。

function noExtraNames(name) {
  var pattern = /(\s*[\+|&|\,|\/]\s*|\s+(and|or)\s+)/i;
  var items = name.split(pattern);
  if (items.length > 1) {
    console.log('Please only enter ONLY ONE FIRST NAME');
    return items[0];
  }
  return name;
}

let tests = [
  'Bob',
  'Billy Bob',
  'Bob and Dave',
  'Bob + Dave',
  'Bob & Dave',
  'Bob / Dave',
  'Bob, Dave',
  'Igor',
  'Andy',
  'Bob+Dave',
];

for (let test of tests) {
  console.log(test, '===> ', noExtraNames(test));
}

答案 1 :(得分:0)

const pattern = /(.*(?=(\s+(and|or)\s+)|(\s*[\&\+,\/\\])))|.*/i;
const patternMatch = str.match(pattern);
if (patternMatch[1]) {
  alert('Please only enter ONLY ONE FIRST NAME');
}
const replaceValue = patternMatch[0].trim();
document.forms[0].first_name.value = replaceValue;

我想这就是您所需要的。