Regex 找不到阻止我的正则表达式与sql查询中的单词匹配的方法

Regex 找不到阻止我的正则表达式与sql查询中的单词匹配的方法,regex,Regex,基本上,我希望匹配sql查询中的表名。查询可以是带有where子句的联接查询或普通查询。当它是联接时,我知道如何匹配表名及其别名。但是当它不是连接时,我只想找到表名,而不是匹配where。如果没有where,我还需要表名 到目前为止,这是我的正则表达式:?您可以使用下面的正则表达式来捕获表名及其可能的别名,这些别名紧跟在表名之后,或者与表名之前的可选数据库名和架构名连接。它还将捕获在表名称前加上前缀的潜在情况: (?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s

基本上,我希望匹配sql查询中的表名。查询可以是带有where子句的联接查询或普通查询。当它是联接时,我知道如何匹配表名及其别名。但是当它不是连接时,我只想找到表名,而不是匹配where。如果没有where,我还需要表名


到目前为止,这是我的正则表达式:?您可以使用下面的正则表达式来捕获表名及其可能的别名,这些别名紧跟在表名之后,或者与表名之前的可选数据库名和架构名连接。它还将捕获在表名称前加上前缀的潜在情况:

(?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s+as\s+(\w+)|\s+(?!where\s+)(\w+))?
这显示了下面解释的此正则表达式的基本形式:

?:from |加入匹配或加入 \s+匹配一个或多个空白字符 ?:\w+\.{0,2}?\w+捕获以下内容 ?:\w+\.{0,2}将以下内容在零到两倍之间匹配此匹配可能位于表名称之前的数据库名称和/或架构名称 \w+匹配任意单词字符一次或多次 \.火柴。字面上 £? 可选择按字面匹配 \w+与任何单词字符匹配一次或多次这是表名称 ?|\s+作为\s+\w+|\s+?!在哪里\s+\w+?(可选)匹配以下任一项这是潜在别名是一个分支重置组-这使每个选项的捕获组的编号与第二个捕获组的编号相同,否则,选项1的捕获组编号为2,选项3的捕获组编号为3。 选择1 \s+as\s+匹配任意空白字符一次或多次,后跟as,后跟任意空白字符一次或多次 \在第二个捕获组中捕获任意单词字符一次或多次 选择2 \s+匹配任意空格字符一次或多次 ?!其中\b否定前瞻确保后面的内容不是下面第二个正则表达式显示如何扩展此项以添加其他否定的地方 \在第二个捕获组中捕获任意单词字符一次或多次 或者,您也可以将\K附加到正则表达式中,请参见@Wiktor的注释,以获取其用法示例,从中删除第一个捕获组之前的所有内容。它会将您的匹配重置为零,而不是从表t中获得类似的匹配-

用扩展的否定项来覆盖MySQL中的大部分内容

(?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s+as\s+(\w+)|\s+(?!(?:(?:(?:inner|cross)\s+)?join|(?:natural\s+)?(?:(?:left|right)\s+)?(?:outer\s+)?join|where|(?:group|order)\s+by|having|limit|into|union|on|for\s+update|select)\b)(\w+))?      

你用哪种语言?重要的是要注意,因为有不同的正则表达式引擎;每种方法都不同。顺便说一句,[^WHERE]说要匹配任何不是W,H,E,RI的字符,请使用delphi,但是从regex网站复制粘贴效果非常好,这就是我没有指定的原因@CTWheels因为Delphi使用PCRE正则表达式库。确保在regex101中使用PHP/PCRE选项。为什么要在打开后获取表名?这将只获取关系,而不是表名或其别名。你在使用哪个数据库;是否也要捕获更模糊的表名,如数据库名或架构名,例如Production.table或[database].[schema].[table]?@ctwheels我对catch Production.table、tablename和£tablename感兴趣。我以为?会先看一个词,然后再看一个词,这就是为什么。我不是正则表达式专家,但我现在需要它。我在做一些动态的事情,这就是为什么我要提取表名。
(?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s+as\s+(\w+)|\s+(?!(?:(?:(?:inner|cross)\s+)?join|(?:natural\s+)?(?:(?:left|right)\s+)?(?:outer\s+)?join|where|(?:group|order)\s+by|having|limit|into|union|on|for\s+update|select)\b)(\w+))?