How to extract a substring using regex
我有一个字符串,其中有两个单引号,即'字符。在单引号之间是我想要的数据。
如何编写regex从以下文本中提取"所需数据"?
1
| mydata ="some string with 'the data i want' inside"; |
假设需要单引号之间的部分,请将此正则表达式与Matcher一起使用:
例子:
1 2 3 4 5 6 7
| String mydata ="some string with 'the data i want' inside";
Pattern pattern = Pattern. compile("'(.*?)'");
Matcher matcher = pattern. matcher(mydata );
if (matcher. find())
{
System. out. println(matcher. group(1));
} |
结果:
- 该死。。我总是忘了非贪婪修饰语:(
- 当您期望出现多个事件时,将"if"替换为"while"
- 请注意,此代码示例需要matcher.find()才能工作。调用matcher.group(1)时,未能调用此方法将导致"未找到匹配"异常。
- 如果您想要第一个结果,它应该是".group(0)"而不是".group(1)"。
- @mfontura组(0)将返回与外部""的完全匹配。组(1)返回不包含""本身的""之间的内容。
- 马克为什么在这种情况下使用问号?*不匹配0或更多吗?那么,如果两个引文之间有一个空字符串,它会匹配吗?
- 这段代码工作得很好,但结果中包含了分隔符(")。如何获取不带分隔符的子字符串?
- @马克·拜尔斯嗨,你能看看这个问题吗?stackoverflow.com/questions/34938232/…
- 这个答案有点误导性,因为提供的代码返回'the data i want',而不是the data i want。如果要删除单引号,应打印matcher.group(1)。
- @博拉德利的回答从一开始是正确的,我做了回卷。
- @拉里,这是一个迟到的答复,但是?在这种情况下,它是非贪心修饰符,因此对于this 'is' my 'data' with quotes,它将提前停止并返回is,而不是尽可能多地匹配字符,并返回is' my 'data,这是默认行为。
- @tagy22如何处理返回单引号之间值的组(1)?我该如何做其他事情,如[废话]?它在括号旁边吗?
你不需要Regex。
将apache commons lang添加到项目中(http://commons.apache.org/proper/commons lang/),然后使用:
1
| String dataYouWant = StringUtils. substringBetween(mydata, "'"); |
- 谢谢。。。。。我是新来的…所以我认为这是一个简单的方法……
- 您必须考虑软件的分发方式。如果它类似于WebStart,那么只添加ApacheCommons来使用这一功能是不明智的。但也许不是,除了ApacheCommons还有很多东西要提供。即使很难,了解regex也很好,你必须小心使用它。regex非常难读、写和调试。考虑到一些上下文,使用这个可能是更好的解决方案。
- 有时,StringUtils已经存在,在这些情况下,这个解决方案更清晰和可读。
- 这就像买一辆车行驶5英里(一年只行驶一次)。
- 当子字符串查找特定的字符串或值时,regex查找格式。它越来越有活力。如果您要查找的是模式而不是特殊值,则需要regex。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main (String[] args ) {
Pattern pattern = Pattern. compile(".*'([^']*)'.*");
String mydata ="some string with 'the data i want' inside";
Matcher matcher = pattern. matcher(mydata );
if(matcher. matches()) {
System. out. println(matcher. group(1));
}
}
} |
- system.out.println(matcher.group(0));<---基于零的索引
- 不。组(0)具有特殊意义,捕获组从索引组(1)开始(即组(1)在答案中是正确的)。"捕获组从左到右索引,从一开始。"零组"表示整个模式"-源:DOCS.Oracle .COM/JavaSe/ 8 /DOCS/API/Java/UTL/ReGEX/Helip;
- 我用了第(1)组,但没有得到任何结果…
因为您还勾选了scala,这是一个不带regex的解决方案,可以轻松处理多个带引号的字符串:
1 2 3 4
| val text ="some string with 'the data i want' inside 'and even more data'"
text. split("'"). zipWithIndex. filter(_._2 % 2 != 0). map(_._1 )
res : Array[java. lang. String] = Array(the data i want, and even more data ) |
- 聪明的。喜欢它。
- 如此可读的解决方案,这就是为什么人们喜欢斯卡拉我相信:)
- 为什么不仅仅是EDCOX1?6?或者Java中的那种程度?我想如果你认为这是一个可读的解决方案的话,你可能需要做一次脑部扫描——看起来好像有人在给我做一些代码高尔夫。
有一个简单的一行程序:
1
| String target = myData. replaceAll("[^']*(?:'(.*?)')?.*", "$1"); |
通过使匹配组成为可选的,在这种情况下还可以通过返回空白来满足未找到的报价。
看实况演示。
1
| String dataIWant = mydata. replaceFirst(".*'(.*?)'.*", "$1"); |
就像在javascript中一样:
1
| mydata.match(/'([^']+)'/)[1] |
实际regexp为:/'([^']+)'/。
如果使用非贪婪修饰符(根据另一篇文章),则如下所示:
1
| mydata.match(/'(.*?)'/)[1] |
它更干净。
String dataIWant = mydata.split("'")[1];
看实况演示
在斯卡拉,
1 2 3 4 5 6 7 8 9 10 11 12 13
| val ticks ="'([^']*)'".r
ticks findFirstIn mydata match {
case Some(ticks(inside)) => println(inside)
case _ => println("nothing")
}
for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches
val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception
val ticks =".*'([^']*)'.*".r
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks |
我同意米海烤面包机的回答,它的工作很有魅力。只是根据更新对它进行了一个小的修改。
1 2 3 4 5 6 7 8
| let string ="fact-tab-1 extra stuff you dont care about"
let matchResult = string.match(/fact-tab-./);
console.log(matchResult)
console.log('The extracted part would be : ' + matchResult[0])
document.getElementById('result').innerHTML = 'The extracted part would be : ' + matchResult[0]; |
运行示例:jsfiddle