我正在尝试验证用户输入的存储在数组中的主机名列表。我有一个应与有效主机名匹配的正则表达式模式(请参阅regex101上的操作)。 它不匹配任何包含空格的字符串。
当我在JS playground或实际执行环境(ServiceNow工作流程)中运行此代码时,带有空格的数组元素是匹配的。
带空格的元素不应匹配,应过滤掉。我在这里想念什么?
到底发生了什么?!
var targets_raw = ["google.com","hello world","shop.fsf.org"];
// this regex tests if a string is a valid hostname
const regex = new RegExp('^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$', 'g');
function validateHost(host) {
return host.match(regex)
}
// trim whitesace and check for valid hostname
for (var i = 0; i < targets_raw.length; i++) {
targets_raw[i] = targets_raw[i].trim();
if (!validateHost(targets_raw[i])) {
console.log(targets_raw[i] + ' is not a valid hostname. It will be omitted.');
}
}
// remove any invalid hostnames
var targets = targets_raw.filter(validateHost);
console.log(targets);
控制台输出:[ "google.com", "hello world", "shop.fsf.org" ]
所需的输出:[ "google.com", "shop.fsf.org" ]
您不正确地转义了.
字符。 JS正则表达式需要两个反斜杠来转义字符。
[a-zA-Z0-9])\.
不正确[a-zA-Z0-9])\\.
是正确的
尝试使用此代码:
const regex = new RegExp('^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$', 'g');