【问题标题】:How to not include specific string in regex如何在正则表达式中不包含特定字符串
【发布时间】:2014-06-17 08:44:14
【问题描述】:

我需要在大学里构建某种“java 语法”编译器。 我想使用正则表达式来匹配变量类型和变量名(int num , String str 等)。 所以我需要正则表达式来匹配其中一种 var 类型(String、int、char、boolean、double),然后至少有一个空格和 var name,但 var name CAN NOT 是其中之一类型。 我怎么做?我试过了:

(String|int|char|boolean|double)[\s]+([a-zA-Z]+[\w]*^(String|int|char|boolean|double))

我知道它不是 java 正则表达式语法(只有一个 '\' 而不是两个),但我在 http://regexpal.com/ 中尝试过,但它不起作用。

非常感谢!

【问题讨论】:

    标签: java regex


    【解决方案1】:

    负面预测

    ^ 在你拥有它的地方不起作用(它是一个试图断言我们位于字符串开头的锚点)。但是你已经很接近了,如果你只是在后面的括号开头添加?!,它会变成一个否定的前瞻

    (String|int|char|boolean|double)\s+(?!(?:String|int|char|boolean|double)\b)[a-zA-Z]+
    

    See demo

    • 删除了 \s\w 周围的括号(不需要)。
    • (?!(?:String|int|char|boolean|double)\b) 的消极后视断言表明后面的内容不是您的类型之一。如果断言成功,引擎会继续匹配您的 var,由 [a-zA-Z]+ 指定
    • 有关外观的更多信息,请参阅参考部分。

    参考

    【讨论】:

    • 仅供参考,修复了一个小错误,添加了演示。如果您有任何问题,请告诉我。 :)
    • 不客气,很高兴听到这个消息!既然它有效,请您单击答案左侧的复选标记以标记您接受它吗?这就是代表系统的工作方式,接受答案会为回答者和您赢得声誉。干杯!
    • 当然,没问题。但我发现它并没有我想象的那么好 - 因为例如“int intro”应该可以工作,而在您的解决方案中却不是。我的意思是我需要它来接受除实际字符串“int”之外的所有内容。
    • 抱歉,我是这个网站的新手,能否请您将其他问题的链接发给我?我很乐意接受。再次感谢。
    • 顺便说一句,我不知道答案是否适合你。很高兴听到一些反馈。 :) 给我一点时间。
    【解决方案2】:

    我认为适用于所有情况的答案..

    public static void main(String[] args) {
        String s = "String String1";
        System.out.println(s.matches("(?!((String|double)\\s+(String|double|\\d+|$)$))(.*)"));
    } 
    
    O/P :
    String s = "String String1";
    answer : true
    
    String s = "String String";
    answer : false
    
    String s = "String 123";
    answer : false
    
    String s = "String ";
    answer : false
    

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多