如何在正则表达式中使用Caret和dollar?

时间:2015-04-29 05:23:28

标签: java regex

我正在尝试学习正则表达式,但我只对我的第一个代码感到震惊。 我读到,插入符号(^)和美元($)分别用于在测试的开始和结束时进行匹配。但我很难弄清楚我的代码有什么问题。

  public class Test1 {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String letterA="cat will die";
            String pattern="[^cat]";
            System.out.println(letterA.matches(pattern));
            String pattern1="^(cat)";
            System.out.println(letterA.matches(pattern1));
            String letterB="Lending your cat";
            String pattern3="[cat$]";
            System.out.println(letterB.matches(pattern3));
            String pattern4="cat$";
            System.out.println(letterB.matches(pattern4));
        }

    }

每个系统都给我输出false

5 个答案:

答案 0 :(得分:5)

Caret和dollar是Anchors,只是告诉你的模式是否应该寻找行的开头(Caret)和结束(Dollar)。

此外,在括号内,此语法已更改。如果你以[^ ...]开头,那就意味着一个否定,你试图匹配任何不在插入符号之后的字符。括号内的$只是告诉引擎你正在寻找$ char的匹配。

此外,如果匹配整个字符串,则java中的匹配仅返回true。

记住这些事情,让我们传递你的每个案例,看看他们为什么不匹配:

String letterA="cat will die";
String pattern="[^cat]";

这个正则表达式正在寻找一个不是' c'或者' a'或者' t。像" f"会为这一个回归。

System.out.println(letterA.matches(pattern));
String pattern1="^(cat)";

()是capturing groups,他们在匹配的情况下什么都不做。 ^只是告诉你将在字符串的开头查找匹配,并且你的正则表达式试图匹配字符串" cat"。对于这种情况,这是唯一可能返回true的匹配。

String letterB="Lending your cat";
String pattern3="[cat$]";

这只是试图匹配单个字符串,这些字符串可以是' c'或者' a'或者' t'或者' $'

最后:

String pattern4="cat$";

只是试图匹配正确的字符串' cat' (锚定到最后,但它确实没有什么区别)。

所以,回到你的问题,你需要使用匹配任意数量的字符的。*运算符,如:

  • ^cat.*$(如果你想要一个以 cat 开头的字符串)
  • ^.*cat$(如果你想要一个以 cat 结尾的字符串)
  • ^.*cat.*$(如果您想要任何包含 cat 文字的字符串)

答案 1 :(得分:0)

阅读String.matches上的文档。表达式必须完全匹配。例如,尝试模式.*cat.*

此外,^中使用的[]表示否定,因此[^cat]读取正则表达式引擎 - “不是c,或a或t”。不确定你是否知道,以防万一...

答案 2 :(得分:0)

实际上,Java matches()方法匹配整个字符串。因此,使用^$ 不必要

您必须使用以下内容:letterA.matches("cat.*")来匹配与"cat"策略的字符串。

边界匹配:匹配"字边界" "\\b"

表示

示例字符串:" catterpillar将死亡&#34 ;;

letterA.matches("cat.*") //将返回true

letterA.matches("\\bcat\\b.*") //将返回false

答案 3 :(得分:0)

这是使用正则表达式进行部分匹配的示例。

import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;


public class HelloWorld{

     public static void main(String []args){
        Console console = System.console();
        String letterA="cat will die";

            String spattern=".*cat.*";
            System.out.println(letterA.matches(spattern));

            Pattern pattern = 
            Pattern.compile(console.readLine("%nEnter your regex: "));
            Matcher matcher = 
            pattern.matcher(console.readLine("Enter input string to search: "));

            System.out.println(matcher.find());
     }
}

答案 4 :(得分:0)

根据java docs

  

public boolean matches()尝试匹配整个地区   模式。

     

如果匹配成功,则可以通过获得更多信息   开始,结束和分组方法。

     

返回:       true当且仅当整个区域序列与此匹配器模式

匹配时

现在每个人都已经提到了你的正则表达式中的缺陷。我不会写关于它的。但是,让我对插入符号(^)和美元($)

进行一些分析

阅读^ $和^

  1. ^字面匹配,如果该行有行的开头。 `有效说话毫无意义!为什么因为每一行都有一个开头,每行都会匹配 - 甚至是空行!
  2. 请参阅以下代码

    String letterA="";//i'm not writing anything because matches attempt to match entire region
            String pattern="^";
            System.out.println(letterA.matches(pattern));
    

    它会为您提供输出True

    每一行也都有结尾

    String letterA="";
            String pattern="$";
            System.out.println(letterA.matches(pattern));
    

    这也会为您输出true