正则表达式去除单引号并保留撇号

时间:2012-03-21 19:52:18

标签: java regex grep apostrophe

我想解析文本文件中的单词。应保留撇号,但应删除单引号。以下是一些测试数据:

john's apostrophe is a 'challenge'

我正在尝试使用grep,如下所示:

grep -o "[a-z'A-Z]*" file.txt

它产生:

john's
apostrophe
is
a
'challenge'

需要删除单词challenge周围的引号。

正确/期望的输出应为:

john's
apostrophe
is
a
challenge

编辑:由于共识似乎是撇号有问题需要识别,我现在正在寻找一种方法来剥离所有单词中的任何类型的撇号(前导,尾随,嵌入)。这些单词将被添加到词汇索引中。搜索这个短语也应该删除撇号。这可能还需要另一个问题。

2 个答案:

答案 0 :(得分:4)

您需要使用grep吗?这是一个sed示例,以防万一:

$ echo "john's apostrophe is a 'challenge'" | sed -re "s/'(\S*)'/\1/g"
john's apostrophe is a challenge

sed是一个流编辑器,我用它来执行替​​换(格式为s/pattern/subst/g代表全局。我匹配任意数字({{1非空白字符(*)并将其替换为同一组字符,将其称为\S(我用圆括号\1捕获它。

编辑:好的,这是一个丑陋的Perl式(...)示例:

grep

我不知道我做了什么,所以可能出现意想不到的行为:)

使用$ echo "john's apostrophe is a 'challenge'" | grep -oP "(?<=')\S*(?=')|\w+'?\w*" john's apostrophe is a challenge 我使用positive lookaround assertions来匹配 单引号中的单词(断言用于引号不是匹配的一部分)grep)带有可选撇号的单词,用“一个或多个单词字符”(|)后跟\w+表示(或不表示)然后再选择一些单词字符。

更多编辑:这是一个'命令,似乎可以完成这项工作并应对@ tchrist的例子:

sed

答案 1 :(得分:4)

这是一个更简单的grep - 唯一方法:

grep -E -o "[a-zA-Z]([a-z'A-Z]*[a-zA-Z])?" file.txt

在Java中是:

Pattern.compile("[a-zA-Z]([a-z'A-Z]*[a-zA-Z])?")

(这两个都是“ASCII字母,可选地后跟ASCII字母和/或撇号和ASCII字母的混合”。想法是匹配的子字符串必须以字母开头并以字母结尾,但如果长度超过两个字符,那么它可以包含撇号。)

要接受非ASCII字母,Java可以写成:

Pattern.compile("\\p{L}([\\p{L}']*\\p{L})?")

编辑以获取更新的问题(删除撇号):我认为你不能用 grep来做到这一点;但是稍微扩展我们的曲目,你可以写:

tr -d "'" file.txt | grep -E -o "[a-zA-Z]+"

或在Java中:

String apostrippedStr = str.replace("'", "");

Pattern.compile("[a-zA-Z]+") // or "\\p{L}+" for non-ASCII support
// ... apply pattern to apostrippedStr