我是正则表达式语法的新手,经过一整天挖掘谷歌,仍然无法在java中找到一个好的正则表达式从字符串中提取我想要的东西... 例如:我有一个
stringA = "-3.5 + 2 * 3 / 2"
stringB = "2 * 3 / 2 - 3.5";
我使用的正则表达式是
regex="[\\+\\-\\*\\/]", -->choose +,-,*,or / from the target;
通过这样做,我能够捕获字符串中的任何符号,包括负号。
然而,我只是在跟随空格时才捕获负号( - )。
也就是说,我想要
的结果string A as [ +, *, /], these three signs and stringB as [ *, / , -]
我意识到我只需要在正则表达式中为负号添加另一个条件,例如
regex = "[\\+{\\-\\s}\\*\\/]" ---> I want to choose same thing but with
extra condition "-"sign has to follow by a whitespace.
方括号不能正常工作就像这样......是否有人可以指导我如何在原始正则表达式中添加另一个条件?或写一个新的正则表达式来满足需要?非常感谢你提前。
答案 0 :(得分:1)
Chi,这可能是你正在寻找的简单正则表达式:
[+*/]|(?<=\s)-
它是如何运作的?
中间有一个替换|
,这是一种说“匹配或匹配”的方式。
在左侧,字符类[+*/]
匹配一个字符,即+,*或/
在右边,lookbehind (?<=\s)
断言“前面有一个空格字符”,然后我们匹配一个减号。
如何使用?
List<String> matchList = new ArrayList<String>();
try {
Pattern regex = Pattern.compile("[+*/]|(?<=\\s)-");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
如果您有兴趣,可以阅读regex lookaheads and lookbehinds。
如果您有任何疑问,请与我联系。
答案 1 :(得分:0)
你可以做的是抛弃课程([]
封闭Pattern
),改为使用OR
,并使用负前瞻作为减号,以避免它出现接着是一个数字:
String input0 = "2 * 3 / 2 - 3.5";
String input1 = "-3.5 + 2 * 3 / 2";
Pattern p = Pattern.compile("\\+|\\-(?!\\d)|\\*|/");
Matcher m = p.matcher(input0);
while (m.find()) {
System.out.println(m.group());
}
System.out.println();
m = p.matcher(input1);
while (m.find()) {
System.out.println(m.group());
}
<强>输出强>
*
/
-
+
*
/
答案 2 :(得分:0)
试试String#replaceAll()
。它非常简单。
// [any digit] or [minus followed by any digit] or [decimal]
String regex = "(\\d|-\\d|\\.)";
String stringA = "-3.5 + 2 * 3 / 2";
String stringA1 = stringA.replaceAll(regex, "").trim();
System.out.println(stringA1);
String stringB = "2 * 3 / 2 - 3.5";
String stringB1 = stringB.replaceAll(regex, "").trim();
System.out.println(stringB1);
输出
+ * /
* / -
注意:您可以使用String#split("\\s+")
。
答案 3 :(得分:0)
又一种解决方案。
也许你想要抓住减号而不管白色空间,而不是取决于它的含义,i。即二进制减运算符,而不是数字前的减号。
你可能会遇到这样的情况:你可以有一个二进制减去而没有任何空间,比如3-5
,或者你可以在数字之前加一个减号,并且它们之间有一个空格(在许多编程语言,包括Java)。因此,为了正确捕获您的令牌(正负数和二元运算符),您可以尝试这样做:
public static void main(String[] args) {
String numberPattern = "(?:-? *\\d+(?:\\.\\d+)?(?:E[+-]?\\d+)?)";
String opPattern = "[+*/-]";
Pattern tokenPattern = Pattern.compile(numberPattern + "|" + opPattern);
String stringA = "-3.5 + -2 * 3 / 2";
Matcher matcher = tokenPattern.matcher(stringA);
while(matcher.find()) {
System.out.println(matcher.group().trim());
}
}
无论白色空格如何,您都在这里捕捉运算符和ALSO操作数。如果您只需要二元运算符,只需过滤它们。
尝试使用字符串"-3.5+-2*3/2"
(根本没有空格),无论如何你都会拥有你的代币。