java - 无法在 Java 正则表达式中使用 '-' 字符,它在给定文本中找不到模式

标签 java regex

这是我第一次使用正则表达式,遇到了一些问题。

我正在编写一个简单的编译器程序,现在我正在开发一个“解析”模块,该模块需要一些汇编程序行并将其拆分为多个部分。

该行的某些部分可能包含以下表达式之一:

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] 匹配 abc

这就是为什么你不能在正则表达式中使用 - ,当然,它不应该是字符集。

有关字符集的更多信息:http://www.regular-expressions.info/charclass.html

关于java - 无法在 Java 正则表达式中使用 '-' 字符,它在给定文本中找不到模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405838/

相关文章:

mysql - 用于起始字符序列 mysql 5.1 的正则表达式

正则表达式匹配尽可能多的字符串

java - 最大化窗口时JPanel只有一个黑色方 block 并且JPanel太大

java - 如何获取动态创建的复选框android的值?

java - 如何从服务器向列表中的多个客户端发送消息

javascript - 正则表达式测试在 nodejs 中失败了吗?

.net - 获取字符串后的单词

c#正则表达式查找并提取给定长度的数字

java - 获取颜色边界之间所有像素的算法?

java - Android ArrayAdapter 不显示每行中的所有数据