如何在 Java/Kotlin 中检查字符串是不是包含非 KSC5601 字母?

Posted

技术标签:

【中文标题】如何在 Java/Kotlin 中检查字符串是不是包含非 KSC5601 字母?【英文标题】:How can I check if a String contains non-KSC5601 letter or not in Java/Kotlin?如何在 Java/Kotlin 中检查字符串是否包含非 KSC5601 字母? 【发布时间】:2021-06-01 17:27:10 【问题描述】:

我正在检查韩文字母,并尝试使用[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣*$]。 对于数字、英语、韩语。我正在使用^[0-9a-zA-Zㄱ-ㅎ|ㅏ-ㅣ|가-힣]*$

我正在使用 DX 音乐字体。而且它不支持所有的字母,因为它是 KSC5601 类型。 我想检查一下这个字体是否可以在字符串中显示特定的字母。

例如,如果我输入,它什么也不显示。我想显示字符串包含非 KSC5601 类型的 Toast 消息,该类型无法在 EditText 或 TextView 中显示以再次写入。

et_answer.addTextChangedListener(object : TextWatcher 
    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) 
    

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) 
    

    override fun afterTextChanged(p0: Editable?) 
        if (!Pattern.matches(TextUtil.KoEnNumRex, et_answer.text.toString())) 
            MyToast(this@MyActivity).makeText("Only Korean, English, Number are available.")
            return
        
    

如果能显示错误字母的索引就好了。

【问题讨论】:

【参考方案1】:
 public class MainActivity extends Activity 

    private EditText editText;

    private String CharacterSet = "~#^|$%&*!FGHIJKLMOPTWXYZ";

    private InputFilter filter = new InputFilter() 

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 

            if (source != null && !CharacterSet.contains(("" + source))) 
                return "";
            
            return null;
        
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText);
        editText.setFilters(new InputFilter[]  filter );
    


这里我们定义了一个有效的字符集并且只允许它作为输入

<EditText
    android:id="@+id/nameText"
    android:layout_
    android:layout_
    android:inputType="text"
    android:digits="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ" />

同样的事情也可以在布局中完成

如果你以这种方式实现 InputFilter

InputFilter typeFilter = new InputFilter() 
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
            Pattern p = Pattern.compile("[a-zA-Z|\u4e00-\u9fa5]+");
            Matcher m = p.matcher(source.toString());
            if (!m.matches()) return "";
            return null;
        
    ;

其中 \u4e00-\u9fa5 这是中文字母的 unicode 范围,如果您找到韩语的 unicode 范围,可以这样做

【讨论】:

好吧,这不检查 KSC5601 类型。 将该字符集添加到允许列表中 什么字符?允许列表在哪里? 字符集arrayy或android数字属性 好吧..你不懂韩语。它有两千多套。

以上是关于如何在 Java/Kotlin 中检查字符串是不是包含非 KSC5601 字母?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

优雅地把Html解析为Java/Kotlin实体对象

Kotlinkotlin中的空指针检查

优雅地把Html解析为Java/Kotlin实体对象

优雅地把Html解析为Java/Kotlin实体对象

优雅地把Html解析为Java/Kotlin实体对象