我有像这样转换输入字符串的模式/匹配器行:
1 3 Hi [2 1 4]
进入这样的数组:
[0] => "1"
[1] => "3"
[2] => "Hi"
[3] => "2 1 4"
这就是代码:
String input = sc.nextLine();
Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|\\w+");
Matcher m = p.matcher(input);
List<String> cIn = new ArrayList<String>();
while(m.find()) cIn.add(m.group());
现在我意识到有时候我会得到一些负值,像4 2 -1 2
这样的输入。由于输入是一个String,我不能真正使用任何正则表达式来获得该负值。
下面的代码中,我使用
Integer.parseInt(cIn.get(0));
将该字符串值转换为Integer,这实际上就是我所需要的。
你能想出一种方法,让我可以将-
字符和数字char保持在一起吗?然后我会检查是否有-
字符来转换数字并乘以-1
。 (如果有更好的方式我会很高兴听到)。
像往常一样,请原谅我的英语。
答案 0 :(得分:3)
你绝对可以使用正则表达式来捕获负数,但这取决于你想要清除的东西。
"(?<=\\[)[^\\]]+|[-\\w]+"
最简单的方法是简单地在已识别的单词字符组中添加“ - ”。然而,这也将导致像'9-9'这样的怪异阵型合法。考虑到你已经匹配像'9_9'那样的令牌,我不确定这对你来说是个问题。我可能只是在这个正则表达式的末尾添加另一个替换:
"(?<=\\[)[^\\]]+|\\w+|-?\\d+"
允许使用可选的' - '字符,后跟至少一个数字。或者,负数。这是非常强大的 - 你只是定义了另一种类型的匹配(非常具体),但每次你找到一个新的情况,你真的不应该只是继续添加'| ...'到结尾你的正则表达式。这是关于做你正在做的事情的效率最低的方法。在您的情况下,似乎这不是一个真正的问题,但是当您的用例扩展时,您应该考虑这一点。
答案 1 :(得分:3)
方法如下:(?<=\\[)[^\\]]+|-?\\w+
。
-?
正则表达式意味着您可以在单词(-
)之前加\\w+
,但如果只需要数字,则使用\\d+
和{{1 }}
这是我写的测试:
\\w+
按预期产生@Test
public void regex() {
String input = "-1 3 Hi [2 1 4]";
Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");
Matcher m = p.matcher(input);
List<String> cIn = new ArrayList<String>();
while (m.find())
cIn.add(m.group());
System.out.println(cIn);
}
。
答案 2 :(得分:1)
您可以在正则表达式中使用可选的-
:
Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");
答案 3 :(得分:0)
非常花哨的正则表达式,但是那些捕获你想要做的事情的技巧更少呢?
(?:\[(?:\s*[-]?\d+\s*)*\]|(?:[-]?\d+|\w+))