如何在第一个选项卡实例之后删除所有字符?

Posted

技术标签:

【中文标题】如何在第一个选项卡实例之后删除所有字符?【英文标题】:How can I remove all characters after the first instance of a tab? 【发布时间】:2018-05-31 08:15:13 【问题描述】:

我有一个很大的文本文件,大约有 200,000 行单词翻译。我想保留标签后显示的翻译文本。

abaxial van  osovine
abbacy  opatstvo
abbaino     kora
abbatial    opatski
abbe    opat
abbé    opat
abbé    sveæenik
hematological parameters    hematološki pokazatelji

如何在标签的第一个实例之前去除所有字符?

【问题讨论】:

text.split("\\s2\\s*") @MartinErlic 这很奇怪,因为\t 不是空格。也许您的问题应该是:“如何删除第一个 tab 字符之前的所有文本?”。或者最后,正如您的代码 sn-p 所做的那样。 @MartinErlic 那么也许您应该在尝试操作数据之前弄清楚数据是什么。使用一个好的文本编辑器来显示空格和制表符,例如Notepad++. 困惑!!!问题标题“删除标签之后的所有字符”。问题文本:“去掉 之前两个空格的所有字符”。它是制表符还是2个空格?是需要删除之前还是之后的文本? 如果问题与空格无关,请编辑问题文本以反映这一点。 【参考方案1】:

您可以使用这个正则表达式来匹配翻译前的所有内容:

 .+? 2,

在线尝试这个正则表达式:https://regex101.com/r/P0TY1k/1

使用此正则表达式在您的字符串上调用 replaceAll

yourString.replaceAll(".+? 2,", "");

编辑:如果分隔符不是 2 个空格而是一个制表符,你可以试试这个正则表达式:

.+?(?: 2,|\t)

【讨论】:

对不起,很好的答案,但问题是错误的,“2个空格”实际上是一个制表符。见comment to question。 @Andreas 已编辑。 问题说“第一个实例...”,那么正则表达式不应该以.+? 开头吗?使用 greedy quantifier 之类的 .+,它将替换所有直到 last 实例,而不是第一个实例。像.+? 这样的reluctant quantifier 将在第一时间停止。 @Andreas 我看到原始/翻译对都在不同的行中,所以这不会有什么不同吗?还是编辑了。【参考方案2】:

所以你可以使用正则表达式来非常有效地处理字符串。

导入 java.util.regex.Matcher; 导入 java.util.regex.Pattern;

公共类主

/**
 * Splits the line related to translation into 2 groups by splitting it on
 * two spaces " " and storing the splits into two named groups (key,
 * value)</br>
 * Group1 (key) is the text before the two spaces.</br>
 * Group2 (value) is the text after the two spaces.</br>
 */
private static final Pattern TRANSLATION_PATTERN = Pattern.compile("<key>.*)\\s\\s+(<value>.*)");

public static String grabTextAfterTwoSpaces(String input) 
    Matcher matcher = TRANSLATION_PATTERN.matcher(input);

    /*
     * You have to call .matches() for the regex to actually be applied.
     */
    if (!matcher.matches()) 
        throw new IllegalArgumentException(String.format("Provided input:[%s] did not contain two spaces", input));
    

    return matcher.group("value");


public static void main(String[] args) 
    System.out.println(grabTextAfterTwoSpaces("abaxial van  osovine"));
    System.out.println(grabTextAfterTwoSpaces("abbacy  opatstvo"));
    System.out.println(grabTextAfterTwoSpaces("abbaino     kora"));
    System.out.println(grabTextAfterTwoSpaces("abbatial    opatski"));
    System.out.println(grabTextAfterTwoSpaces("abbe    opat"));
    System.out.println(grabTextAfterTwoSpaces("abbé    opat"));
    System.out.println(grabTextAfterTwoSpaces("abbé    sveæenik"));
    System.out.println(grabTextAfterTwoSpaces("abbacy  opatstvo"));

    System.out.println(grabTextAfterTwoSpaces("hematological parameters    hematološki pokazatelji"));

Try it online!

因此,如果您对组使用“值”,您将获得 2+ 个空格之后的所有内容。

枇杷

opatstvo

可乐

奥帕茨基

奥帕特

奥帕特

sveæenik

opatstvo

hematološki pokazatelji

【讨论】:

对不起,很好的答案,但问题是错误的,“2个空格”实际上是一个制表符。见comment to question。

以上是关于如何在第一个选项卡实例之后删除所有字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 从另一个页面操作引导选项卡

当使用angular8单击选项卡时,如何使选项卡聚焦在第一个字段上

如何从不在第一个位置的任何字符串中删除所有选定的字符

如何从我的 XCODE 上的另一个选项卡更改 UILabel 值

iOS 7 - 发送到已释放实例 0x15d17cc0 的消息 [关闭]

在第一个下划线之后提取子字符串