Java正则表达式:Matcher.find问题
在匹配.find()时,我很难区分两个模板 当给定以下输入:“GET/boards/boardName/lists”时,它与第一个模板而不是第二个模板匹配。我做错了什么Java正则表达式:Matcher.find问题,java,regex,Java,Regex,在匹配.find()时,我很难区分两个模板 当给定以下输入:“GET/boards/boardName/lists”时,它与第一个模板而不是第二个模板匹配。我做错了什么 提前感谢这是因为(.+?)将匹配长度为1或更多的字符组合,这将使您的正则表达式引擎匹配以下部分: boardName/lists 还请注意,如果您首先尝试以下正则表达式: GET /boards/(.+?)/lists 它也将匹配字符串,但区别在于,在这个正则表达式中,组1将包含boardName,但在第一个正则表达式中,组
提前感谢这是因为
(.+?)
将匹配长度为1或更多的字符组合,这将使您的正则表达式引擎匹配以下部分:
boardName/lists
还请注意,如果您首先尝试以下正则表达式:
GET /boards/(.+?)/lists
它也将匹配字符串,但区别在于,在这个正则表达式中,组1将包含boardName
,但在第一个正则表达式中,组1将包含b
(因为?
使+
成为一个非贪婪模式)
如果希望第一个正则表达式与字符串不匹配,可以使用a和a来匹配后面没有单词列表的字符串:
GET /boards/([^/]+)(?!lists)
在第一个字符中,+?
仍将匹配(非贪婪地)最后一个正斜杠后的字符,因为
匹配除换行符以外的任何单个字符。因此,它首先匹配这个表达式。如果不希望第一个表达式匹配,请将其更改为GET/boards/([^/]+)$
是否确实输入不会同时匹配这两个表达式?在第一种情况下,组1包含boardName/list
。在第二种情况下,组1包含boardName
。两种模式都将匹配。@hwnd-Yep,这将匹配在GET/boards/
之后只有一个单词的字符串。您能检查一下吗:我得到的输出与您提到的不同。@YoungHobbit-Yep,很抱歉我错过了这一点,第一个正则表达式组1将是字符b
,因为没有匹配
GET /boards/([^/]+)(?!lists)