NKA-198、HM-1-0022、SCIDG 133
想要上述代码的正则表达式。我如何接受这些代码并将其分配给变量?
请推荐我并提前致谢。
最佳答案
首先确保您对要匹配的字符串的一般结构有充分的了解 - 例如,允许使用哪些分隔符(您的示例建议 -
、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]+)+)
)匹配任何大写字母序列,后跟数字序列,前面有单个连字符或空格字符。序列“空格或连字符加数字”可以任意重复,但至少重复一次。此规范可能过于严格或过于宽松,这就是为什么您必须查找/猜测您希望匹配的 Id 遵循的一般规则的原因。从严格意义上讲,您一直要求的正则表达式是
^(NKA-198|HM-1-0022| SCIDG 133)$
,这肯定不是您需要的。最外面的括号将匹配定义为第一个捕获组,允许在
replace 方法
中将匹配内容引用为$1
。使用replace
还要求您的正则表达式需要匹配整个原始字符串。其他部分/第一个正则表达式
从字符串的开头开始非贪婪地匹配任何内容。非贪婪运算符 (
.*?
) 确保找到最短的可能匹配,但仍允许匹配完整模式(看看如果删除问号会发生什么)。这样您最终将在first_id
中得到第一个匹配的 id。附加部分/第二个正则表达式
贪婪地匹配(=尽可能多)直到标识符模式匹配。这样你就会得到最后一场比赛。否定字符类 (
[^A-Z]
) 是必要的,因为您没有有关相关 ID 结构的进一步信息,特别是有哪些/有多少个前导大写字符。该类确保匹配 id 开头之前的最后一个字符不是大写字符。交替中的^
迎合了orig
以可匹配 ID 开头的特殊情况 - 在这种情况下,否定的 char 类将不匹配,因为没有“last”匹配前的前缀字符'。
引用文献
有关正则表达式模式和用法的更详细(更有效)的解释可以在 here 中找到。 。 MDN提供有关 JavaScript 中正则表达式用法的信息。
关于javascript - 接受数字、字母和特殊字符的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744166/