0

我有看似简单的任务,但我没有使用正则表达式的经验。
我必须使用预定义的消息文本解析 SMS 正文,以获取某些信息。
这是一个例子:

名字!{FirstName} {LastName} isikukoodiga {PersonCode} on sõlminud EMT Reisikindlustuse lepingu numbriga {PolicyNumber},mis kehtib alates {CoverStartDate} kell {CoverStartTime} kuni {CoverEndDate} kell {CoverEndTime} (Eesti aja järgi)。Hind:{PremiumEur} 欧元。Tutvu tingimustega ({Terms}) http://emt.ee/kindlustus。Kahjukäsitluse 号码 +3727330700。

我必须解析出花括号中的所有内容。

我在Java中想出了这样的东西:

public static final String REGEX_CONFIRMATION = "Täname! (.*) (.*) isikukoodiga (.*) on sõlminud EMT Reisikindlustuse lepingu numbriga (.*), mis kehtib alates (.*) kell (.*) kuni (.*) kell (.*) \\(Eesti aja järgi\\). Hind: (.*) eurot. Tutvu tingimustega \\((.*)\\) http://emt.ee/kindlustus. Kahjukäsitluse number \\+3727330700.";

但它只解析出以下组:

{MARIS}、{PLOTS}、{17204046521}、{22414152}、{01.10.2002}、{13:07}、{02.10.2002}、{23:59}。

如您所见{Terms},缺少。而且我似乎无法弄清楚问题出在哪里?

4

5 回答 5

0

使用这种模式怎么样?

\{.*?\}
于 2012-10-15T06:57:07.077 回答
0

简单地使用不是更有意义吗

\{[^{}]*\}

作为你的正则表达式?在字符串中,您需要将其写为

"\\{[^{}]*\\}"

解释:

\{      # Match an opening brace
[^{}]*  # Match any number of characters except braces
\}      # Match a closing brace
于 2012-10-15T06:57:18.113 回答
0

对我来说似乎是正确的。使用 DOTALL(在其他情况下可能是 MULTILINE)选项。DOTALL 可以添加为"(?s)Täname!...". 然后".*"还映射换行符。

由于找到了先前的匹配项,因此可能就是这样。

于 2012-10-15T07:20:57.277 回答
0

当您在 {TERMS} 部分中包含括号时,它是否有效?代替:

String regex = "...Tutvu tingimustega \\((.*)\\) http://emt.ee/kindlustus. ...";

你可以试试:

String regex = "...Tutvu tingimustega (.*) http://emt.ee/kindlustus. ...";

或者取决于您在 {TERMS} 字符串中的内容,您可以将 _ .* _ 更改为 _ [^)]* _ 这样您会发现零到 N 个不结束括号的字符。

于 2012-10-15T07:32:06.913 回答
0

http://www.java2s.com/Code/Java/Regular-Expressions/Findallmatches.htm

连同以下正则表达式

\{(.*?)\}
于 2012-10-15T07:09:58.780 回答