- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个像这样的 String
:
String s="social network such as '''[http://www.facebook.com Facebook]''' , "+
"'''[http://www.twitter.com Twitter]''' and '''[http://www.tumblr.com tumblr]'''";
我只需要检索 '''[
和 ]'''
中的那些 String
。
示例输出:
http://www.facebook.com Facebook, http://www.twitter.com Twitter, http://www.tumblr.com tumblr
我在使用 regex
时遇到困难,所以我使用 recursion
想到了这个想法:
System.out.println(filter(s, "'''[", "]'''"));
....
public static String filter(String s, String open, String close){
int start = s.indexOf(open);
int end = s.indexOf(close);
filtered = filtered + s.substring(start + open.length(), end) + ", ";
s = s.substring(end + close.length(), s.length());
if(s.indexOf(open) >= 0 && s.indexOf(close) >= 0)
return filter(s, open, close);
else
return filtered.substring(0, filtered.length() - 2);
}
但在某些情况下,我需要在 String
的相同模式中检索单词,例如 '''
和 '''
,它会说 String index out of range 因为 start
和 end
将保持相同的值。
我该如何克服这个问题? regex
是唯一的解决方案吗?
最佳答案
Regex 是执行此操作的合适工具。使用 Pattern
和 Matcher
.
public static String filter(String s, String open, String close){
Pattern p = Pattern.compile(Pattern.quote(open) + "(.*?)" + Pattern.quote(close));
Matcher m = p.matcher(s);
StringBuilder filtered = new StringBuilder();
while (m.find()){
filtered.append(m.group(1)).append(", ");
}
return filtered.substring(0, filtered.length() - 2); //-2 because trailing ", "
}
Pattern.quote
确保 open
和 close
的任何特殊字符都被视为常规字符。
m.group()
返回与 m.find()
匹配的最后一个 String
的组。
m.find()
查找与正则表达式匹配的所有子字符串。
注意:在这两个中,end
都被分配了 s.indexOf(close, start + 1)
,使用 String#indexOf(String, int)
和 StringBuilder#indexOf(String, int)
这样即使 open
和 close
值相同,也不会发生错误。
递归:
public static String filter(String s, String open, String close){
int start = s.indexOf(open);
int end = s.indexOf(close, start + 1);
//I took the liberty of adding "String" and renaming your variable
String get = s.substring(start + open.length(), end);
s = s.substring(end + close.length());
if (s.indexOf(open) == -1){
return get;
}
return get + ", " + filter(s, open, close);
}
与其立即添加 ", "
,不如稍后处理它更容易一些。另外,请注意 s.substring(end + close.length(), s.length())
与 s.substring(end + close.length());
此外,我觉得查看 s.indexOf(...) == -1
是否比检查 >=0
更简洁。
真正的问题在于您对待 filtered
的方式。首先,您需要将 filtered
声明为 String
类型。接下来,由于您正在进行递归,因此不应连接到 filtered
。这将使我们首先看到 filtered
的行:String filtered = s.substring(start + open.length(), end) + ", ";
。如果您修复了该行,您的解决方案就会起作用。
迭代:
public static String filter(String str, String open, String close){
int open_length = open.length();
int close_length = close.length();
StringBuilder s = new StringBuilder(str);
StringBuilder filtered = new StringBuilder();
for (int start = s.indexOf(open), end = s.indexOf(close, start + 1); start != -1;
start = s.indexOf(open), end = s.indexOf(close, start + 1)){
filtered.append(s.substring(start + open_length, end)).append(", ");
s.delete(0, end + close_length);
}
return filtered.substring(0, filtered.length() - 2); //trailing ", "
}
此迭代方法使用了 StringBuilder
,但没有它也可以完成同样的操作。它生成两个 StringBuilder
,一个是空的,另一个保存原始 String
的值。在 for
循环中:
int start = s.indexOf(open), end = s.indexOf(close)
获取对索引的引用start != -1
如果 s
不包含 open
start = s.indexOf(open), end = s.indexOf(close)
在每次循环迭代后,再次找到索引。循环内部将正确的子字符串附加到 finished
并从另一个 StringBuilder
中删除附加部分。
关于java - 查找包含在定界符中的字符串部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341761/
我有一列data.frame,其中一些空格应该作为分隔符,而某些只是一个空格。 #input data dat <- data.frame(x=c("A 2 2 textA1 textA2 Z1",
所以我试图分解一个包含答案列表的字符串。 例如:答案:1. 梳理。 2.拇指。 3.坟墓(地下墓穴)。 4. 子宫。 5.面包屑。 6. 炸弹。 7. NumPy 。 8.沉着冷静。 9. 屈服。 有
我有包含多个查询的文件。如何使用 DELIMITER 将它们分开?我像在 mysql 中一样尝试过,但它没有编译: DELIMITER % CREATE SEQUENCE logins_seq I
这个问题在这里已经有了答案: Does -* have any special meaning in regular expression? (1 个回答) 关闭 8 年前。 我有一个像 22 +
我正在尝试使用 sscanf 解析以下字符串: query=testword&diskimg=simple.img 如何使用 sscanf 解析出“testword”和“simple.img”? ss
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示: foo 4.500 bar 3.00 1.3 3 foo bar 如何读取由空格而不是换行符分隔的文件?有什么方法可以设置
这是我的代码: With ad.Tables(2) For i As Integer = 0 To .Rows.Count - 1 If .Rows(i)("name") &
我正在排队,例如 数组大小:4 来自 cin,我想首先检查字符串是否正是这个,然后提取整数。 我找到了读取字符串并提取整数的方法: string start; getline (cin
我正在尝试读取以这种形式编写的文本文件: AB523:[joe, pierre][charlie][dogs,cat] ZZ883:[ronald, zigomarre][pele]
我是 PIG 的新手,有人可以帮助我如何加载一个包含多个字符(在我的例子中为“^^”)作为列分隔符的文件。 例如我有以下列的文件aisforapple^^bisforball^^cisforcat^^
var wrapped_string = "shouldn't this\ work?" JSLint给出了严重的擒纵机构错误。 那么我们如何在 JavaScript 中执行heredoc呢?我有一个
问题:我需要读取 CSV 文件。我使用 FileHelpers 库来实现这一点。 问题是我需要一个动态定界符(用户定义),这意味着任何东西都可以是定界符(逗号、分号、制表符、换行符,以及其他任何东西)
我试图读入一个由 powershell 执行的 sql 文件。一切正常,除了 powershell 因单词定界符而抛出错误。所以我的问题是如何在我的 sql 文件中使用定界符(我只能对 sql 文件进
我需要能够通过 DBI 发出“创建触发器”。我似乎无法使分隔符命令正常工作。任何人都可以找到一种方法来完成这项工作吗? 代码: use strict; use DBI; my $dbargs = {m
我知道我可以使用 Mustache.tags('[[', ']]'); 更改默认分隔符 我深入研究了源代码,但找不到也不知道如何更改不转义 HTML 定界符,默认情况下为 {{{ }}}。感谢您的帮助
我正在尝试获取 std::string 值并将其用作 std::getline() 函数中的分隔符但无论我做什么,编译器都会给我错误。这就是我想要做的: std::stringstream ss(s)
我正在尝试实现我自己的 beanstalkd 客户端作为学习围棋的一种方式。 https://github.com/kr/beanstalkd/blob/master/doc/protocol.txt
我正在编写一个显示代码和输出的样式指南。它目前的结构使得代码只需要描述一次,并以其原始版本和解释版本显示,如下所示: #{ image_tag 'image.png' } PLACE_THE
是否可以将默认字段分隔符从逗号更改为其他字符,例如用于导出的 '|'? 最佳答案 下面是一个使用选项卡的示例。 到一个文件: CSV.open("myfile.csv", "w", {:col_sep
我是一名优秀的程序员,十分优秀!