regex JavaScript正则表达式的下划线

vxqlmq5t  于 2023-10-22  发布在  Java
关注(0)|答案(2)|浏览(157)

我有一个GUI输入字段,用户在文本框中输入文本,然后单击保存。我必须验证下面模式的文本/字符串。

String: "--cpuname=some_text" // Invalid string, underscore not allowed
String: "--cpuname=$(some_text)" // Valid string
String: "--cpuname=$(some_text) -order=abc_def" //Valid string

如果cpuname值中有下划线,则其无效。但是,如果下划线在$()之间,就像上面的第二个例子一样,那么下划线是允许的。注意:--cpuname可能不总是字符串的开头,文本的其他部分可以有下划线。(除了cpuname值)
我希望我的要求是明确的。
我试过的代码:

const regex = /--cpuname=[$(][^)]+\)|--cpuname=[^_]+(?:\s-\w+=\w+)*$/;

function checkStringValidity(str) {
  if (!regex.test(str)) {
    alert("Underscore not allowed");
  }
}
ffscu2ro

ffscu2ro1#

我会提出一个不同的逻辑:创建一个匹配 invalid--cpuname值的正则表达式,如果匹配,则触发警报。

const regex = /--cpuname=(?:\$\([^()]*\)|(?!\$\()[^_\s])*_/;

function checkStringValidity(str) {
  return regex.test(str);
}

const strs = ["--cpuname=some_text","--cpuname=$(some_text)", "--cpuname=$(some_text) -order=abc_def"];
for (const str of strs) {
  if (checkStringValidity(str)) {
    console.log("Underscore not allowed in cpuname value" + "\nThe '" + str + "' string is invalid!");
  } else {
    console.log("The '" + str + "' string is valid!");
  }
}

参见regex demo

  • 详情 *:
  • --cpuname=-文本
  • (?:\$\([^()]*\)|(?!\$\()[^_\s])*-匹配- 0次或更多次-以下任一项的非捕获组
  • \$\([^()]*\)- a $(+除() + )之外的任意零个或多个字符
  • |-或
  • (?!\$\()[^_\s]-一个不同于_的字符和空白,它不会启动$(字符序列
  • _-下划线。
3vpjnl9f

3vpjnl9f2#

如果值有下划线,并且没有括在$(和)之间,则无效。如果值被括在$(和)之间,则允许使用下划线。让我们分解一下问题:
我们需要找到--cpuname=后跟值。该值可以是:括在$(和)之间,可以包含任何字符。未括起且不应包含下划线。让我们为此编写一个正则表达式:
--cpuname=$([^)]+):这匹配--cpuname=$(some_text)。--cpuname=[^_\s]+:这匹配--cpuname=someText,但不匹配--cpuname=some_text。把这两个和手术室结合起来|运算符应该给予我们想要的正则表达式。
下面是更新的代码:

const regex = /--cpuname=(\$\([^)]+\)|[^_\s]+)/;

function checkStringValidity(str) {
  const matches = str.match(regex);
  if (!matches || matches[0] !== matches.input) {
    alert("Underscore not allowed in cpuname value");
    return false;
  }
  return true;
}

让我们用你的例子来测试一下:
--cpuname=some_text应该无效。
--cpuname=$(some_text)应该有效。
--cpuname=$(some_text)-order=abc_def应该有效。

相关问题