如何从一个字符串中获取特定格式的所有子字符串

6
我有一个很长的字符串,想从中获取格式为[[某个单词]]的所有子字符串。也就是说,要获取用方括号包含的单词列表。

现在一种方法是将字符串按空格分割,然后使用过滤器过滤列表,但问题是有时[[某个单词]]不存在于一个单词中,在它前面或后面可能有一个,、空格或.

怎样做最好呢?

我会欣赏Scala的解决方案,但这更多是一个编程问题,如果您使用其他语言(例如Python)提供解决方案,我会转换为Scala。

这个问题不同于标记为重复的问题,因为正则表达式需要能够适应方括号之间的非英文字母字符。


1
你能发布一些你想要提取单词的示例字符串吗?你可以使用这个正则表达式\[{2}[^[\]]+\]{2}来匹配和提取你想要的单词。演示 - Pushpesh Kumar Rajwanshi
2个回答

3
您可以使用这个正则表达式(?<=\[{2})[^[\]]+(?=\]{2})来匹配和提取所有包含在双方括号中的单词。以下是一个Python解决方案。
import re

s = 'some text [[someword]] some [[some other word]]other text '
print(re.findall(r'(?<=\[{2})[^[\]]+(?=\]{2})', s))

打印,

['someword', 'some other word']

我从未在Scala上工作过,但是这里有一种Java的解决方案,而且我知道Scala只是基于Java的,因此这可能有所帮助。

String s = "some text [[someword]] some [[some other word]]other text ";
Pattern p = Pattern.compile("(?<=\\[{2})[^\\[\\]]+(?=\\]{2})");
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group());
}

打印,
someword
some other word

请告诉我这是否是您要找的内容。

好的,让我看看在Scala中是否可以找到re.findall的替代方法。 - saadi
我只想在我的列表中保留“某个词”和“另一个词”,如何以良好的方式去掉括号? - saadi
1
抱歉,我以为你也想要括号。这很容易。只需将正则表达式更改为(?<=\\[{2})[^\\[\\]]+(?=\\]{2})。让我更新我的答案。 - Pushpesh Kumar Rajwanshi
@saadi:更新了我的答案。希望这是你需要的。如果你遇到任何问题,请告诉我。 - Pushpesh Kumar Rajwanshi

2

Scala解决方案:

val text = "[[someword1]] test [[someword2]] test 1231"

val pattern = "\\[\\[(\\p{L}+)]\\]".r //match words with brackets and get content with group
val values = pattern
   .findAllIn(text)
   .matchData
   .map(_.group(1)) //get 1st group
   .toList

println(values)

你好,感谢您的回复。我相信您在评论中提到的 w+ 只适用于英文单词,因为我尝试了阿拉伯语,但失败了。您能否更新这个正则表达式以适应非英语单词和字母? - saadi
@saadi:尝试使用\\p{L}(这将捕获不仅是英语,还包括Unicode中表示的其他语言的字符)而不是\\w - Pushpesh Kumar Rajwanshi
@PushpeshKumarRajwanshi在这个字符串و[[لبنان]] بما فيها مدينة [[القدس]]، بعد أن هزم جيش [[مملكة بيت المقدس|بيت المقدس]] هزيمة上未能工作。我尝试将您的正则表达式放在那里,但它无效,我想那可能是特定于Python或其他什么东西的。您能否帮我找到一个不太具有英语特色的解决方案?Scala代码在这里 - saadi
1
@saadi:\\p{L} 只代表一个字符,所以你需要写成 \\p{L}+ - Pushpesh Kumar Rajwanshi
1
@saadi: 你可以按照我的回答中给出的正则表达式,允许双括号内的任何文本。使用这个正则表达式 (?<=\\[{2})[^\\[\\]]+(?=\\]{2}) 此外,由于此正则表达式不需要任何分组,因此请确保写group(0)而不是group(1) - Pushpesh Kumar Rajwanshi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接