[英]how to match end of string or space in a java regex
我得到了一個 java 正則表達式,表示“字符串或空格結尾”,可以使用捕獲組 ($|\s) 工作。 但是,這似乎是一種 hack,因為我不想捕獲任何東西。 我不應該使用一組方括號來表示一組/字符 class 嗎? 我應該使用更好的東西嗎?
以下無關細節:
我的實際目標是從此字符串中獲取 http 端口:
2019-11-14 23:58:12.321 信息 55572 --- [主要] sbc.etTomcatEmbeddedServletContainer:Tomcat 在端口:51
日志中的這一行也可能采用以下形式:
2019-11-14 23:58:12.321 INFO 55572 --- [主] sbc.etTomcatEmbeddedServletContainer:Tomcat 已在端口上啟動:1448/51 https47
所以我需要完全匹配“http”而不是“https”,並指定“http”后跟一個空格(所以它不能是 https)或“http”后跟行尾。
所以我的 java 代碼是:
(\\d+)/http($|\\s)
嘗試積極的前瞻
(\d+)(?=\/http($|\s))
使用單詞邊界:
\b(\d+)/http\b
這將阻止https
匹配,但也會在字符串的最后匹配。
如果您不喜歡使用捕獲組,則可以使用正向前瞻,但只需檢查“http”術語末尾的單詞邊界。 當您想要匹配出現在第二個術語之前的術語但不想在匹配中包含第二個術語時,前瞻用於正則表達式。 因此,請考慮嘗試:
\\d+(?=/http\\b)
在這里,只有數字匹配。 (?=
術語是積極的前瞻術語。請注意,它不會捕獲“/http”並將其包含在您的匹配中。但是,它只會匹配數字后綴為“/http”的數字。 \\b
術語確保僅匹配作為獨立單詞存在的“http”。因此,不會匹配“https”,但后面有空格或換行符或只是輸入結尾的“http”將匹配匹配。希望這會有所幫助。
您可以使用它來匹配字符串中的特定單詞
.*\\bhttp\\b.*
在 java
String matcher="2019-11-14 23:58:12.321 INFO 55572 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 51447/http 51448/https";
System.out.println(matcher.matches(".*\\bhttp\\b.*")); //returns true
String matcher="2019-11-14 23:58:12.321 INFO 55572 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 51447 51448/https"; // removed http to test
System.out.println(matcher.matches(".*\\bhttp\\b.*")); // returns false
您的模式也匹配行尾( $
)或空格( \\s
),請使用前瞻( ?=
)來檢查空格或行尾
(\\d+)\\/http(?=$|\\s)
這將匹配您正在尋找的內容,您也可以使用
:\\s+(\\d+)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.