我是Java的新手.作为一名.Net开发人员,我非常习惯Regex.Net中的课程.Regex(正则表达式)的Java实现并不错,但它缺少一些关键功能.
我想为Java创建自己的帮助器类,但我想可能已经有一个可用.那么在Java中是否有可用于Regex的免费且易于使用的产品,或者我应该自己创建一个?
如果我会写自己的课程,你认为我应该在哪里分享它以供其他人使用?
[编辑]
有人抱怨说我没有解决当前Regex班级的问题.我会试着澄清我的问题.
在.Net中,正则表达式的使用比在Java中更容易.由于这两种语言都是面向对象的,并且在很多方面非常相似,我希望在两种语言中使用正则表达式都有类似的经验.不幸的是,事实并非如此.
这是Java和C#中的一些代码.第一个是C#,第二个是Java:
在C#中:
string source = "The colour of my bag matches the color of my shirt!";
string pattern = "colou?r";
foreach(Match match in Regex.Matches(source, pattern))
{
Console.WriteLine(match.Value);
}
Run Code Online (Sandbox Code Playgroud)
在Java中:
String source = "The colour of my bag matches the color of my shirt!";
String pattern = "colou?r";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
while(m.find())
{
System.out.println(source.substring(m.start(), m.end()));
}
Run Code Online (Sandbox Code Playgroud)
我试图在上面的示例代码中对两种语言都公平.
你在这里注意的第一件事是类的.Value成员Match(与使用.start()和 …
在scala.util.matching.Regex trait MatchData中我看到支持组名,我认为这与(Regex Named Capturing Groups)有关
但是由于Java在版本7之前不支持组名,因为我理解它(参考),Scala版本2.8.0(Java HotSpot(TM)64位服务器VM,Java 1.6.)给了我这个例外:
scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
^
at java.util.regex.Pattern.error(Pattern.java:1713)
at java.util.regex.Pattern.group0(Pattern.java:2488)
at java.util.regex.Pattern.sequence(Pattern.java:1806)
at java.util.regex.Pattern.expr(Pattern.java:1752)
at java.util.regex.Pattern.compile(Pattern.java:1460)
Run Code Online (Sandbox Code Playgroud)
所以问题是Scala支持的命名捕获组?如果是这样的话有什么例子吗?
我想知道Java是否与C#的命名模式匹配相当.例如,在C#中,我可以这样做:
var pattern = @";(?<foo>\d{6});(?<bar>\d{6});";
var regex = new Regex(pattern , RegexOptions.None);
var match = regex.Match(";123456;123456;");
var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null;
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null;
Run Code Online (Sandbox Code Playgroud)
这似乎是一种抓住群体的干净方式.Java可以做类似的事情,还是我需要根据索引位置抓取组?
String foo = matcher.group(0);
Run Code Online (Sandbox Code Playgroud) 我是Java的正则表达式的新手,我无法弄清楚如何在表达式中包含命名的捕获组.我正在为Confluence的Universal Wiki Converter编写一个ScrewTurn图像转换器.这就是我所拥有的:
String image = "\\[image(?<align>auto)?\\|\\|{UP\\(((?<namespace>\\w+)\\.)?(?<pagename>[\\w-]+)\\)}(?<filename>[\\w- ]+\\.[\\w]+)\\]";
Pattern imagePattern = Pattern.compile(image, Pattern.CASE_INSENSITIVE);
Run Code Online (Sandbox Code Playgroud)
它抛出这个例外Pattern.comiple():
java.util.regex.PatternSyntaxException: Unknown look-behind group near index 19
\[image(?<align>auto)?\|\|{UP\(((?<namespace>\w+)\.)?(?<pagename>[\w-]+)\)}(?<filename>[\w- ]+\.[\w]+)\]
^
Run Code Online (Sandbox Code Playgroud)
我之前在C#中使用了这样的命名捕获组(?<namedgroup>asdf),但在Java中没有.我错过了什么?
我正在测试一个返回JSON响应的Web服务,我想从响应中提取多个值.典型的响应将在列表中包含多个值.例如:
{
"name":"@favorites",
"description":"Collection of my favorite places",
"list_id":4894636,
}
Run Code Online (Sandbox Code Playgroud)
响应将包含许多部分,如上例所示.
我想在Jmeter中做的是通过JSON响应并按照我可以将返回的名称和描述作为一个条目进行迭代的方式拉出上面概述的每个部分.
到目前为止我能够做的是使用模板$ 1 $返回带有正则表达式提取器("name":"(.+?)")的名称值.我想拉出名字和描述,但似乎无法让它发挥作用.我尝试使用正则表达式"name":"(.+?)","description":"(.+?)",模板为$ 1 $$ 2 $,但没有任何成功.
有谁知道在这个例子中我如何使用正则表达式来提取多个值?
Java中是否有一种方法(可能还有一个额外的开源库)来识别a中的捕获组java.util.regex.Pattern(即在创建匹配器之前)
Java文档中的示例:
捕获组通过从左到右计算它们的左括号来编号.在表达式((A)(B(C)))中,例如,有四个这样的组:
Run Code Online (Sandbox Code Playgroud)1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C)
原则上应该可以从(编译的)模式中识别这些.
更新:从@Leniel和eslewhere看来,这个工具("命名组")将在2011年中期出现在Java 7中.如果我不能等待,我可以使用jregex虽然我不太确定API是什么是.
我的目标是从java中的字符串中提取名称和数字.示例:输入 - >输出
1234 - >数字:[1234],姓名:[]
1234,34,234 - >数字:[1234,34,234],名称:[]
12,foo,123 - >数字:[12,123],姓名:[foo]
foo3,1234,4bar,12,12foo34 - >数字:[1234,12],姓名:[foo3,4bar,12foo34]
foo,bar - > - > numbers:[],姓名:[foo,bar]
我想出了[^,]+(,?!,+)*匹配字符串的所有部分,但我不知道如何只匹配数字或名称(名称可以包含数字 - 如例子).谢谢
我有一个时间戳:200212312359
我怎么能把它拆分成2012.12.31.23.59
简单的方法是.split("(?<=\\G.{2})"),然后结合阵列的前2个元素,但我想知道是否有任何更专业的解决方案.
我有几个字符串多个掩码.我想知道有没有更好的方法来处理字符串与掩码解析而不是String.spilt和循环标记和识别序列等.这个代码也很笨拙,许多令牌逻辑必须编码.
样品掩码可以是:
示例字符串:
示例代码:
String[] arr = input.split("-");
int pos = 0;
for(String k:arr){
if(pos == 0) {
//-- k is of PROD
...
...
}
..
...
pos++;
}
Run Code Online (Sandbox Code Playgroud)
针对每种掩码类型保留上述类型的代码.