diff --git a/.idea/modules.xml b/.idea/modules.xml
index eb749e40..402d47a4 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -38,6 +38,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt
index d81f3636..85913dff 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt
@@ -68,8 +68,14 @@ class PostImpl(
) {
companion object {
private val log = LogCategory("PostImpl")
- private val reAscii = """[\x00-\x7f]""".asciiPattern()
- private val reNotAscii = """[^\x00-\x7f]""".asciiPattern()
+
+ // ハッシュタグ内部の、半角数字以外のASCII文字にマッチする正規表現
+ // 単体テストで使うのでpublig
+ val reTagAsciiNotNumber = """[\x00-\x2f\x3a-\x7f]""".toRegex()
+
+ // ハッシュタグ内部の、非ASCII文字にマッチする正規表現
+ // 単体テストで使うのでpublig
+ val reTagNonAscii = """[^\x00-\x7f]""".toRegex()
private var lastPostTapped: Long = 0L
@@ -434,9 +440,10 @@ class PostImpl(
if (PrefB.bpWarnHashtagAsciiAndNonAscii.value) {
TootTag.findHashtags(content, account.isMisskey)
?.filter {
- val hasAscii = reAscii.matcher(it).find()
- val hasNotAscii = reNotAscii.matcher(it).find()
- hasAscii && hasNotAscii
+ // タグがASCII文字(半角数字を除く)と非ASCII文字の両方を含むか?
+ val hasAscii = reTagAsciiNotNumber.containsMatchIn(it)
+ val hasNonAscii = reTagNonAscii.containsMatchIn(it)
+ hasAscii && hasNonAscii
}?.map { "#$it" }
?.notEmpty()
?.let { badTags ->
diff --git a/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt b/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt
new file mode 100644
index 00000000..551eba3d
--- /dev/null
+++ b/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt
@@ -0,0 +1,35 @@
+package jp.juggler.subwaytooter
+
+import jp.juggler.subwaytooter.util.PostImpl
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class TestPostImplTagAscii {
+ @Test
+ fun testPostImplTagAscii() {
+ val reTagNumber = """[0-9]""".toRegex()
+ for (cp in 0..<0x100) {
+ val str = "" + cp.toChar()
+ when {
+ cp >= 0x80 -> {
+ assertTrue(PostImpl.reTagNonAscii.containsMatchIn(str))
+ assertFalse(PostImpl.reTagAsciiNotNumber.containsMatchIn(str))
+ assertFalse(reTagNumber.containsMatchIn(str))
+ }
+
+ cp in '0'.code..'9'.code -> {
+ assertFalse(PostImpl.reTagNonAscii.containsMatchIn(str))
+ assertFalse(PostImpl.reTagAsciiNotNumber.containsMatchIn(str))
+ assertTrue(reTagNumber.containsMatchIn(str))
+ }
+
+ else -> {
+ assertFalse(PostImpl.reTagNonAscii.containsMatchIn(str))
+ assertTrue(PostImpl.reTagAsciiNotNumber.containsMatchIn(str))
+ assertFalse(reTagNumber.containsMatchIn(str))
+ }
+ }
+ }
+ }
+}