我有一个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");
}
}
2条答案
按热度按时间ffscu2ro1#
我会提出一个不同的逻辑:创建一个匹配 invalid
--cpuname
值的正则表达式,如果匹配,则触发警报。参见regex demo。
--cpuname=
-文本(?:\$\([^()]*\)|(?!\$\()[^_\s])*
-匹配- 0次或更多次-以下任一项的非捕获组\$\([^()]*\)
- a$(
+除(
和)
+)
之外的任意零个或多个字符|
-或(?!\$\()[^_\s]
-一个不同于_
的字符和空白,它不会启动$(
字符序列_
-下划线。3vpjnl9f2#
如果值有下划线,并且没有括在$(和)之间,则无效。如果值被括在$(和)之间,则允许使用下划线。让我们分解一下问题:
我们需要找到--cpuname=后跟值。该值可以是:括在$(和)之间,可以包含任何字符。未括起且不应包含下划线。让我们为此编写一个正则表达式:
--cpuname=$([^)]+):这匹配--cpuname=$(some_text)。--cpuname=[^_\s]+:这匹配--cpuname=someText,但不匹配--cpuname=some_text。把这两个和手术室结合起来|运算符应该给予我们想要的正则表达式。
下面是更新的代码:
让我们用你的例子来测试一下:
--cpuname=some_text应该无效。
--cpuname=$(some_text)应该有效。
--cpuname=$(some_text)-order=abc_def应该有效。