正则表达式:使用前瞻添加否定案例

时间:2016-02-10 21:17:34

标签: javascript regex

我有来自here的以下正则表达式:

/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/

此正则表达式旨在匹配2个下划线和它们之间的文本。例如:

var regex = /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/;
var string = '_omgbbq_';
regex.exec(string);
>>>["_omgbbq_", "omgbbq", undefined]

但是,我想添加一个额外的规则 - 如果在下划线之前有反斜杠,那么它应该忽略它。例如:

var string = '_omg\\_bbq_'
regex.exec(string)
>>>["_omgbbq_", "omgbbq", undefined]

在此正则表达式中添加否定案例的最佳方法是什么,以便忽略后跟反斜杠的下划线?我倾向于使用lookahead,但是这个正则表达式是如此复杂,我不知道在哪里插入它而不会弄乱任何东西。在这个正则表达式中我可以添加一个前瞻来检测并忽略否定的情况吗?

1 个答案:

答案 0 :(得分:2)

您可以使用

var regex = /^_(?=\S)([\s\S]*?[^\s\\])_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/;
                              ^^^^^^^

我将\S扩展为否定的字符类[^\s],并在其中添加了\,以便我们与最接近的_匹配(如果前面有一个*omg\*bbq*反斜杠。

如果您还需要匹配var regex = /^_(?=\S)([\s\S]*?[^\s\\])_(?!_)|^\*(?=\S)([\s\S]*?[^\s\\])\*(?!\*)/; 之类的字符串(请参阅正则表达式中的第二个选项),您可以使用相同的技术:

var regex = /^_(?=\S)([\s\S]*?[^\s\\])_(?!_)|^\*(?=\S)([\s\S]*?[^\s\\])\*(?!\*)/g;
var string = "_omg\\_bbq_ ";
console.log(string.match(regex));
string = "*omg\\*bbq*";
console.log(string.match(regex));

CREATE TABLE dbo.[User]
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [Group] 
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [UserToGroup]
(
  Name VARCHER(20)
  UserId int NOT NULL,
  GroupId int NOT NULL,
  PRIMARY KEY CLUSTERED ( UserId, Name),
  PRIMARY KEY CLUSTERED ( GroupId, Name),
  FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
  FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
);