1

我是正则表达式的新手,对不起我的问题
我的问题是我想对字符串上的数据进行分组

我想要的是ff:

  1. a-z A-Za-z A-Z0-9(例如:abc、bzc15 但不是 1abc 或 14bc)
  2. 0-9(例如:1,23,56 等)
  3. 这些运营商+ * - /
  4. 白色空间
  5. ()

我想将它们分组到一个数组中,并尽可能保留它们的位置。

前任:

String test = "a + b + 6";

结果应该是这样的

Array[0] = a
Array[1] = White Space
Array[2] = +
Array[3] = White Space
Array[4] = b
Array[5] = White Space
Array[6] = +
Array[7] = White Space
Array[8] = 6

这可能吗?如果是,我应该使用什么模式?
任何帮助都会得到帮助

4

4 回答 4

1

试试这个:

String[] array = test.split("((?<=\\S)(?=\\s))|((?<=\\s)(?=\\S))");

我推断您想在空格的开头或结尾进行拆分。但是正则表达式必须是零宽度,否则会消耗空格。这是通过使用零宽度的look behindslook aheads来实现的。环顾四周的反应是:

  • \s意思是“一个空白字符”
  • \S表示“非空白字符”

然后是环顾四周:

  • (?<=regex)断言前面的输入匹配regex
  • (?=regex)断言以下输入匹配regex

然后是 OR:

  • (regex1)|(regex2)表示“匹配 regex1 或 regex2”
于 2013-05-01T12:24:18.487 回答
0

试试这个:

char[] charArr = test.toCharArray();

例子:

public static void main(String[] args) {
    String test = "a + b + 6";
    char[] charArr = test.toCharArray();
    System.out.println(Arrays.toString(charArr));
}

输出:

[a,  , +,  , b,  , +,  , 6]
于 2013-05-01T12:19:32.103 回答
0

我在这里猜测,但我认为您想解析数学语句,或者换句话说,您正在尝试执行词法分析 - ( http://en.wikipedia.org/wiki/Lexical_analysis )

您可能需要考虑一个完全开发的 java 词法分析/解析生成器,以获得简单的解决方案,我唯一使用过的是 CUP http://www.cs.princeton.edu/~appel/modern/java/CUP /它非常容易使用。

否则,您将需要编写一些自定义解析器代码。

String[] array = test.split("((?<=\\S)(?=\\s))|((?<=\\s)(?=\\S))"); 或者char[] charArr = test.toCharArray(); 在这里不合适,因为以下是您将获得不正确标记化结果的情况

input       Expected Result     Result of bad solution
(2 + 4)     [(,2,+,4,)]         [(2,+,4)]
1+2         [1,+,2]             [1+2]
2 + 14(5)   [2,+,14,(,5,)]      [2,+3,14(5)]
3a          [3,a]               [3a]
abs(5 + 6)  [abs,(,5,+,6,)]     [abs(5,+,6)]

*basicaly anywhere the input does not have an explicit space between token, which    
should be allowed but the other suggested solutions do not support. 
于 2013-05-01T12:41:04.373 回答
0

我认为这个正则表达式会做你想要的:

"((?<=\\d)(?=\\p{Alpha}))|((?<=\\w)(?=\\W))|((?<=\\W)(?=\\w))|((?<=\\W)(?=\\W))"

String它在以下位置拆分:

  • 在一个数字之后[0-9]和一个字母之前[a-zA-Z]
  • 在单词字符[a-zA-Z_0-9]和非单词字符之间。
  • 在两个非单词字符之间。
于 2013-05-01T13:25:51.517 回答