这是我第一次使用正则表达式,遇到了一些问题。
我正在编写一个简单的编译器程序,现在我正在开发一个“解析”模块,该模块需要一些汇编程序行并将其拆分为多个部分。
该行的某些部分可能包含以下表达式之一:
String comp = "[(0)(1)(-1)(D)(A)(!D)(!A)(-D)(-A)(D+1)(A+1)(D-1)(A-1)(D+A)(D-A)(A-D)(D&A)(D|A)(M)(M+1)(M-1)(D+M)(D-M)(M-D)(D&M)(D|M)]";
所以现在我只想看看哪个表达式与下面的正则表达式匹配,因为这就是我现在需要的。
Java 编译器不会编译这样的表达式并写道:
Illegal character range near index 46 [(0)(1)(-1)(D)(A)(!D)(!A)(-D)(-A)(D+1)(A+1)(D-1)(A-1)(D+A)(D-A)(A-D)(D&A)(D|A)(M)(M+1)(M-1)(D+M)(D-M)(M-D)(D&M)(D|M)]
我尝试这样做:
String comp = "[(0)(1)(\\-1)(D)(A)(!D)(!A)(\\-D)(\\-A)(D+1)(A+1)(D\\-1)(A\\-1)(D+A)(D\\-A)(A-D)(D&A)(D|A)(M)(M+1)(M\\-1)(D+M)(D\\-M)(M\\-D)(D&M)(D|M)]";
这使得程序可以编译,但它找到了“D”或“1”等字符串的匹配项,但找不到“D+1”或“D-1”的匹配项,问题是什么以及如何修复它?
最佳答案
当您将正则表达式(的一部分)括在方括号中时,它就成为字符集(或字符类)。一个字符集总是只匹配一个字符。所以你的正则表达式:
[(0)(1)(-1)(D)(A)(!D)(!A)(-D)(-A)(D+1)(A+1)(D-1)(A-1)(D+A)(D-A)(A-D)(D&A)(D|A)(M)(M+1)(M-1)(D+M)(D-M)(M-D)(D&M)(D|M)]
仅匹配以下之一:
'(', '0', ')', '1', '-', ... , '+', ...
另请注意,像 (
, )
和 +
这样的元字符在字符集中没有特殊含义。字符集有自己的元字符,例如 -
,用于表示范围。例如,[a-c]
匹配 a
、b
或 c
。
这就是为什么你不能在正则表达式中使用 -
,当然,它不应该是字符集。
有关字符集的更多信息:http://www.regular-expressions.info/charclass.html
关于java - 无法在 Java 正则表达式中使用 '-' 字符,它在给定文本中找不到模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405838/