【问题标题】:Regex test for valid list of IP and MAC addreseses in one Regex expression一个正则表达式中 IP 和 MAC 地址的有效列表的正则表达式测试
【发布时间】:2020-05-19 01:49:22
【问题描述】:

我有一个 html 文本区域,我希望用户在每行输入一个 mac 地址或一个 ip,想输入多少就输入多少。有没有办法将包括新行在内的整个文本作为单个匹配项进行匹配,如果任何行不符合失败?

任何一行上每行的预期格式示例:

192.168.0.0
10.0.0.0
0.0.0.0
255.255.255.255
000000000000
0000.0000.0000
00:00:00:00:00:00
00-00-00-00-00-00

为 mac 和 ips 试验和混合 2 种不同的正则表达式,我到此为止,这与每个案例相匹配:https://regex101.com/r/tQ0fuk/1 我之前没有使用过多行正则表达式,所以我不能说我完全理解它们和这个问题可能是垃圾哈哈

我知道我可以逐行处理并在任何行失败或跳过该行时失败,但我很好奇这可以用正则表达式推多远。

任何专家:)

【问题讨论】:

  • 我在 SO stackoverflow.com/questions/20702061/… 上发现了一个类似的问题
  • 如果您只是想避免迭代,只需在正则表达式的末尾添加一个 + 并使用 .replace 并检查字符串中是否包含任何内容
  • 您可以在 regex101 中禁用多行 (m) 标志,使其表现得更像编程正则表达式应用程序(它将整个输入视为单个正则表达式输入)。

标签: javascript regex


【解决方案1】:

重新排列 IP 检查,以便首先匹配三位数(防止不完整的行匹配导致检查失败)。假设 IP 和 MAC 匹配是准确的。 删除了多行和全局并使用空格|结束字符串检查代替行尾检查。
使用全字符串匹配。

const ipOrMac = str => /^(((([0-9A-Fa-f]{12})|(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4}))|(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])))(\s|$))+$/.test(str);

console.log(ipOrMac(
`192.168.0.0
10.0.0.0
0.0.0.0
255.255.255.255
000000000000
0000.0000.0000
00:00:00:00:00:00
00-00-00-00-00-00
aaa`));

console.log(ipOrMac(
`192.168.0.0
10.0.0.0
0.0.0.0
255.255.255.255
000000000000
0000.0000.0000
00:00:00:00:00:00
00-00-00-00-00-00
`));

【讨论】:

  • ^ 太棒了!谢谢:)
猜你喜欢
  • 2015-11-22
  • 2011-06-20
  • 2011-07-14
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多