Java 创建仅包含特定字符的字符串[]

Java 创建仅包含特定字符的字符串[],java,regex,Java,Regex,我正在尝试创建一个字符串[],它只包含由某些字符组成的单词。例如,我有一本字典,里面有许多这样的单词: 手臂 军队 艺术 作为 在 攻击 尝试 注意 吸引力 权威 自动的 唤醒 宝贝 返回 坏的 纸袋 平衡 我想缩小列表的范围,使其只包含字符a、b和g的单词。因此,在本例中,列表应仅包含单词“bag”。 目前,我正在尝试使用正则表达式来实现这一点,但之前从未使用过它们,所以我似乎无法让它正常工作。 这是我的密码: public class LetterJugglingMain { public

我正在尝试创建一个
字符串[]
,它只包含由某些字符组成的单词。例如,我有一本字典,里面有许多这样的单词:

手臂 军队 艺术 作为 在 攻击 尝试 注意 吸引力 权威 自动的 唤醒 宝贝 返回 坏的 纸袋 平衡

我想缩小列表的范围,使其只包含字符
a
b
g
的单词。因此,在本例中,列表应仅包含单词“bag”。 目前,我正在尝试使用正则表达式来实现这一点,但之前从未使用过它们,所以我似乎无法让它正常工作。 这是我的密码:

public class LetterJugglingMain {
public static void main(String[] args) {
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt";
    fileReader fr = new fileReader();
    fr.openFile(dictFile);
    String[] dictionary = fr.fileToArray();
    String regx = "able";
    String[] newDict = createListOfValidWords(dictionary, regx);
    printArray(newDict);
}

public static String[] createListOfValidWords(String[] d, String regex){
    List<String> narrowed = new ArrayList<String>();
    for(int i = 0; i<d.length; i++){
        if(d[i].matches(regex)){
            narrowed.add(d[i]);
            System.out.println("added " + d[i]);
        }
    }
    String[] narrowArray = narrowed.toArray(new String[0]);
    return narrowArray;
}
公共类LetterJugglingMain{
公共静态void main(字符串[]args){
String dictFile=“/Users/simonrhillary/Desktop/Dictionary(3.txt)”;
fileReader fr=新的fileReader();
fr.openFile(dictFile);
String[]dictionary=fr.fileToArray();
字符串regx=“able”;
String[]newDict=CreateListofValidWord(字典,regx);
打印阵列(newDict);
}
公共静态字符串[]CreateListofValidWord(字符串[]d,字符串正则表达式){
缩小列表=新建ArrayList();

对于(int i=0;i正则表达式
able
将只匹配字符串
“able”
。但是,如果希望正则表达式匹配
a
b
l
e
,则您要查找的正则表达式是
[able]
(括号中)。如果您想要包含多个此类字符的单词,请添加一个
+
以重复模式:
[able]+

正则表达式
able
将仅与字符串
“able”匹配
。但是,如果希望正则表达式与
a
b
l
e
中的任一字符相匹配,则要查找的正则表达式是
[able]
(括号中)。如果希望单词包含多个此类字符,请添加一个
+
以重复模式:
[able]+


OP需要包含每个字符的单词,而不仅仅是其中一个。 其他角色也不是问题

如果是这种情况,我认为最相似的方法是逐个字符循环整个字符串,并检查它是否包含您想要的所有字符。保留标志以检查是否找到了每个字符

如果情况并非如此

尝试使用正则表达式:

^[able]+$
它的作用如下:

^
匹配字符串的开头,
$
匹配字符串的结尾。这确保您没有获得部分匹配

[able]
匹配您希望字符串包含的字符,在本例中,
a
b
l
e
+
确保字符串中有一个或多个字符

注意:此正则表达式将匹配包含这4个字母的字符串。例如,它将匹配:

艾比,艾比,艾比,艾比

而且不会匹配

可治疗的,可治疗的


OP需要包含每个字符的单词,而不仅仅是其中一个。 其他角色也不是问题

如果是这种情况,我认为最相似的方法是逐个字符循环整个字符串,并检查它是否包含您想要的所有字符。保留标志以检查是否找到了每个字符

如果情况并非如此

尝试使用正则表达式:

^[able]+$
它的作用如下:

^
匹配字符串的开头,
$
匹配字符串的结尾。这确保您没有获得部分匹配

[able]
匹配您希望字符串包含的字符,在本例中,
a
b
l
e
+
确保字符串中有一个或多个字符

注意:此正则表达式将匹配包含这4个字母的字符串。例如,它将匹配:

艾比,艾比,艾比,艾比

而且不会匹配


qable,treatable,and abled.

一个示例正则表达式,用于筛选出集合中至少包含所有字符中一个匹配项的单词。这将匹配至少包含所有字符A、b、g中一个匹配项的任何英文单词(不区分大小写):

(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+
匹配的字符串示例为
bag
baggy
grab

不匹配的字符串示例有
参数

(?i)
表示打开不区分大小写的标志

您需要为每个字符添加与集合中字符数相同的
(?=.*)

我假设一个单词只包含英文字母,所以我指定
[a-z]
。如果需要空格、连字符等,请指定更多

我假设
匹配
String
类中的(String regex)
方法,因此我省略了
^
$


性能可能很差,因为在最坏的情况下(字符位于单词末尾)我认为正则表达式引擎可以在N倍的情况下通过字符串,其中N是集合中字符的数量。它可能不是真正的关注点,因为单词很短,但是如果它是一个瓶颈,你可以考虑做简单的循环。

< P>一个至少包含至少包含单词的样本正则表达式。集合中所有字符的一次出现。这将匹配至少包含一次出现的所有字符a、b、g的任何英文单词(不区分大小写):

(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+
匹配的字符串示例为
bag
baggy
grab

不匹配的字符串示例有
参数

(?i)
表示打开案例插入