NKA-198,HM-1-0022,SCIDG 133
想要上述代码的正则表达式。如何接受这些代码并将其分配给变量??
请建议我并提前致谢。
答案 0 :(得分:1)
首先确保您对要匹配的字符串的一般结构有充分的了解 - 例如,允许使用哪些分隔符号(您的示例建议使用-
,SPC
,但是关于+
?您想要匹配NKA 198
,SCIDG-133
吗?
作为进一步细化的基础,请使用以下代码片段:
var orig = "some string containing ids like 'NKA-198' and 'SCIDG 133'";
var first_id = orig.replace(/^.*?([A-Z]+([ -][0-9]+)+).*/, "$1");
var last_id = orig.replace(/(?:.*[^A-Z]|^)([A-Z]+([ -][0-9]+)+).*/, "$1");
<强> 解释 强>
核心(([A-Z]+([ -][0-9]+)+)
)
匹配任何大写字母序列,后跟一个前面带有单个连字符或空格字符的数字序列。序列&#39;空格或连字符加数字&#39;可以经常重复,但至少一次。此规范可能过于严格或过于宽松,这就是为什么您必须查找/猜测您希望匹配的ID的一般规则服从的原因。从严格意义上说,你所要求的正则表达式是^(NKA-198|HM-1-0022| SCIDG 133)$
,这肯定不是你需要的。
最外面的括号将匹配定义为第一个捕获组,允许在$1
中将匹配的内容引用为replace method
。使用replace
还要求您的正则表达式需要匹配整个原始字符串。
其他部分/第一个正则表达式
从字符串的开头开始,非贪婪地匹配任何内容。非贪婪的运算符(.*?
)确保找到尽可能短的匹配,但仍然允许匹配完整模式(如果丢弃问号,请查看会发生什么)。您最终会在first_id
中找到第一个匹配的ID。
其他部分/秒正则表达式
贪婪地匹配(=尽可能多)直到标识符模式匹配。因此,你最终会得到最后一场比赛。否定的字符类([^A-Z]
)是必要的,因为您没有关于所讨论的ID结构的进一步信息,特别是有哪些/有多少首都字符。该类确保匹配id开头之前的最后一个字符不是大写字符。交替中的^
迎合orig
以匹配ID开头的特殊情况 - 在这种情况下,否定的char类将不匹配,因为没有&#39;最后一个前缀字符&# 39;比赛前。
<强> 参考 强>
可以找到有关正则表达式模式和用法的更详细(且更有能力)的解释here。 MDN提供有关javascript中正则表达式用法的信息。