如何以这种方式匹配字符串?

时间:2018-11-10 18:19:37

标签: java regex

我需要检查字符串是否匹配此特定模式。

模式是:

  

(数字)(允许所有字符)(数字)

,并且数字可能带有逗号(“。”或“,”)!

例如,输入可以是Long version 2018-11-11 02:07:28.858 INFO 4310 --- [on(6)-127.0.0.1] org.mongodb.driver.connection : Opened connection [connectionId{localValue:2, serverValue:183}] to localhost:27017 Person [id=null, name=Joe, email=aa@aa.aa, createdOn=null, modifiedOn=null, version=null] 2018-11-11 02:07:31.519 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.auditing.AuditingHandler : Touched Person [id=null, name=Joe, email=aa@aa.aa, createdOn=null, modifiedOn=2018-11-11T02:07:31.518, version=0] - Last modification at 2018-11-11T02:07:31.518 by unknown 2018-11-11 02:07:31.525 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.mongodb.core.MongoTemplate : Inserting Document containing fields: [modifiedOn, version, name, email, _class] in collection: person 2018-11-11 02:07:31.564 DEBUG 4310 --- [nio-8080-exec-1] o.s.d.m.r.query.MongoQueryCreator : Created query Query: { "name" : "Joe" }, Fields: { }, Sort: { } 2018-11-11 02:07:31.571 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.mongodb.core.MongoTemplate : find using query: { "name" : "Joe" } fields: Document{{}} for class: class com.seedu.server.model.Person in collection: person Person [id=5be71e631ad34410d6a3b123, name=Joe, email=aa@aa.aa, createdOn=null, modifiedOn=2018-11-11T02:07:31.518, version=0] 2018-11-11 02:07:31.590 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.auditing.AuditingHandler : Touched Person [id=5be71e631ad34410d6a3b123, name=Joe, email=bb@bb.bb, createdOn=null, modifiedOn=2018-11-11T02:07:31.590, version=1] - Last modification at 2018-11-11T02:07:31.590 by unknown 2018-11-11 02:07:31.598 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.mongodb.core.MongoTemplate : Calling update using query: { "_id" : { "$oid" : "5be71e631ad34410d6a3b123" }, "version" : { "$numberLong" : "0" } } and update: { "modifiedOn" : { "$date" : 1541873251590 }, "version" : { "$numberLong" : "1" }, "name" : "Joe", "email" : "bb@bb.bb", "_class" : "com.seedu.server.model.Person" } in collection: person 2018-11-11 02:07:31.602 DEBUG 4310 --- [nio-8080-exec-1] o.s.d.m.r.query.MongoQueryCreator : Created query Query: { "name" : "Joe" }, Fields: { }, Sort: { } 2018-11-11 02:07:31.602 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.mongodb.core.MongoTemplate : find using query: { "name" : "Joe" } fields: Document{{}} for class: class com.seedu.server.model.Person in collection: person 2018-11-11 02:07:31.603 DEBUG 4310 --- [nio-8080-exec-1] o.s.d.m.r.query.MongoQueryCreator : Created query Query: { "email" : "bb@bb.bb" }, Fields: { }, Sort: { } 2018-11-11 02:07:31.604 DEBUG 4310 --- [nio-8080-exec-1] o.s.data.mongodb.core.MongoTemplate : find using query: { "email" : "bb@bb.bb" } fields: Document{{}} for class: class com.seedu.server.model.Person in collection: person Person [id=5be71e631ad34410d6a3b123, name=Joe, email=bb@bb.bb, createdOn=null, modifiedOn=2018-11-11T02:07:31.590, version=1] Person [id=5be71e631ad34410d6a3b123, name=Joe, email=bb@bb.bb, createdOn=null, modifiedOn=2018-11-11T02:07:31.590, version=1]

我尝试了500+400,但没有成功!

我知道我必须使用方法Pattern.match(regex,String),但是我找不到正确的正则表达式。

2 个答案:

答案 0 :(得分:1)

处理数字可能很困难。这种方法将处理您的示例,但请仔细检查。我也没有在中间分组中使用“所有字符”,因为“所有”将包括数字,所以我认为查找下一个非数字将是适当的。

此Java正则表达式处理要求:

"((-?)[\\d,.]+)([^\\d-]+)((-?)[\\d,.]+)"

但是,上面有一个潜在的问题。考虑以下: 300 - -200。前述情况与这种情况不符。

现在,基于示例,我认为重点是应该有一个有效的运算符。数学运算的数量可能有限,因此我会将中间的运算符列入白名单。因此,类似于:

"((-?)[\\d,.]+)([\\s]*[*/+-]+[\\s]*)((-?)[\\d,.]+)"

我认为更合适。 [*/+-]可以扩展为电力运营商^等。现在,如果要开始在方程式中添加单词(例如mod),则需要修改表达式。

您可以看到this regular expression here

答案 1 :(得分:0)

在正则表达式中,您必须对点\.进行转义以使其在字面上匹配,并对\+进行转义,否则它将使?成为possessive quantifier。要匹配1个以上的数字,您必须使用量词[0-9]+

对于示例数据,您可以匹配1+位数字,后跟一个可选部分,该部分在开头和结尾处都匹配点或逗号。如果要匹配任何字符1次,则可以使用点。

例如,您也可以使用字符类[-+*]来代替一些点,而不是使用点来列出一些运算符或列出您要匹配的内容。如果这是唯一的匹配项,则可以使用锚点来声明字符串的开头^和结尾$

\d+(?:[.,]\d+)?.\d+(?:[.,]\d+)?

在Java中:

String regex = "\\d+(?:[.,]\\d+)?.\\d+(?:[.,]\\d+)?";

Regex demo

那将匹配:

  • \d+(?:[.,]\d+)? 1+位数字,后跟与.,匹配的可选部分,后跟1+位数字
  • .匹配任意字符(使用。+)重复1次以上
  • 与第一个模式相同