【问题标题】:Contains the word but not a specific word before it包含单词但不包含其前面的特定单词
【发布时间】:2015-04-01 00:39:27
【问题描述】:

我需要正则表达式方面的帮助。代码在 SQL 中,我想匹配所有未引用代理数据库的字符串。

模式是: 包含..且其前面的单词不等于proxy

我想匹配下面的示例词customer

from proxy..vw_xxx a join customer..vw_xxx b
from proxy..vw_xxx
insert into proxy..vw_xxx
from customer..vw_xxx

编辑: 如果我还想捕获 DDL 语句怎么样。 例如: CREATE VIEW vw_yyy AS ... from proxy..vw_xxx a join customer..vw_xxx b from proxy..vw_xxx insert into proxy..vw_xxx from customer..vw_xxx GO CREATE VIEW vw_zzz AS SELECT * FROM customer.vw_xxx GO

我只想捕获第一个 CREATE VIEW。 我使用了正则表达式:

创建视图。*\w+(?

和 /gmis 选项 但它也与第二次创建视图相匹配。

不胜感激。谢谢。

【问题讨论】:

    标签: java c# regex


    【解决方案1】:

    使用否定的基于正则表达式。

    java 正则表达式

    "\\w+(?<!proxy)\\.\\."
    

    C# 正则表达式

    @"\w+(?<!proxy)\.\."
    

    \w+ 匹配一个或多个单词字符,并且仅当点前面没有单词 proxy 时,才匹配后面的双点。

    DEMO

    String s = "from proxy..vw_xxx a join customer..vw_xxx b\n" + 
            "from proxy..vw_xxx\n" + 
            "insert into proxy..vw_xxx\n" + 
            "from customer..vw_xxx";
    Matcher m = Pattern.compile("\\w+(?<!proxy)\\.\\.").matcher(s);
    while(m.find())
    {
        System.out.println(m.group());
    }
    

    输出:

    customer..
    customer..
    

    【讨论】:

    • 必要时添加单词边界\w+(?&lt;!\bproxy)\.\.
    • 嗨,我在上面进行了跟进。我不确定这是否真的可能。将不胜感激您的意见。再次感谢。
    • 如果您还有任何疑问,请作为新问题提出。 I'm not sure if it's really possible.怎么解释?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-05-18
    相关资源
    最近更新 更多