Created
August 6, 2022 11:15
-
-
Save Colerar/182f545a14378a577cd0feb8cbe88920 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import kotlinx.datetime.DayOfWeek | |
import java.time.DayOfWeek.* | |
private val enFull = Regex("""^(mon|tues?|wed(nes)?|thurs?|fri|sat(ur)?|sun)(day|\.)?$""", RegexOption.IGNORE_CASE) | |
fun parseDayOfWeek(expr: String): DayOfWeek? { | |
if (expr.isBlank()) return null | |
val trim = expr.trim() | |
trim.toIntOrNull()?.toDayOfWeek()?.let { return it } | |
matchEn(trim)?.let { return it } | |
matchZh(trim)?.let { return it } | |
return null | |
} | |
private fun matchZh(expr: String): DayOfWeek? { | |
if (expr.length == 1) { | |
return expr.first().zhCharToWeek() | |
} | |
if (expr.length == 2 && expr.startsWith("周")) { | |
expr[1].toString().toIntOrNull()?.toDayOfWeek()?.let { return it } | |
expr[1].zhCharToWeek()?.let { return it } | |
} | |
if (expr.length == 3 && expr.startsWith("星期")) { | |
expr[2].toString().toIntOrNull()?.toDayOfWeek()?.let { return it } | |
expr[2].zhCharToWeek()?.let { return it } | |
} | |
return null | |
} | |
private fun matchEn(expr: String): DayOfWeek? { | |
val full = enFull.find(expr) ?: return null | |
val g1 = full.groups[1]?.value?.lowercase() ?: return null | |
return when { | |
g1 == "mon" -> DayOfWeek.MONDAY | |
g1.startsWith("tue") -> DayOfWeek.TUESDAY | |
g1.startsWith("wed") -> DayOfWeek.WEDNESDAY | |
g1.startsWith("thur") -> DayOfWeek.THURSDAY | |
g1 == "fri" -> DayOfWeek.FRIDAY | |
g1.startsWith("sat") -> DayOfWeek.SATURDAY | |
g1 == "sun" -> DayOfWeek.SUNDAY | |
else -> null | |
} | |
} | |
private fun Int.toDayOfWeek(): DayOfWeek? = when (this) { | |
1 -> MONDAY | |
2 -> TUESDAY | |
3 -> WEDNESDAY | |
4 -> THURSDAY | |
5 -> FRIDAY | |
6 -> SATURDAY | |
7 -> SUNDAY | |
else -> null | |
} | |
private fun Char.zhCharToWeek(): DayOfWeek? = when (this) { | |
'一' -> MONDAY | |
'二' -> TUESDAY | |
'三' -> WEDNESDAY | |
'四' -> THURSDAY | |
'五' -> FRIDAY | |
'六' -> SATURDAY | |
'日' -> SUNDAY | |
'七' -> SUNDAY | |
else -> null | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import io.kotest.matchers.shouldBe | |
import org.junit.jupiter.api.Test | |
import java.time.DayOfWeek.* | |
class DayOfWeekParserTest { | |
@Test | |
fun `parse number day of week`() { | |
parseDayOfWeek("1") shouldBe MONDAY | |
parseDayOfWeek("2") shouldBe TUESDAY | |
parseDayOfWeek("3") shouldBe WEDNESDAY | |
parseDayOfWeek("4") shouldBe THURSDAY | |
parseDayOfWeek("5") shouldBe FRIDAY | |
parseDayOfWeek("6") shouldBe SATURDAY | |
parseDayOfWeek("7") shouldBe SUNDAY | |
parseDayOfWeek("8") shouldBe null | |
} | |
@Test | |
fun `parse English full week`() { | |
parseDayOfWeek("MONDAY") shouldBe MONDAY | |
parseDayOfWeek("TUESDAY") shouldBe TUESDAY | |
parseDayOfWeek("WEDNESDAY") shouldBe WEDNESDAY | |
parseDayOfWeek("THURSDAY") shouldBe THURSDAY | |
parseDayOfWeek("FRIDAY") shouldBe FRIDAY | |
parseDayOfWeek("SATURDAY") shouldBe SATURDAY | |
parseDayOfWeek("SUNDAY") shouldBe SUNDAY | |
parseDayOfWeek("Staurn") shouldBe null | |
parseDayOfWeek("Monday") shouldBe MONDAY | |
parseDayOfWeek("Tuesday") shouldBe TUESDAY | |
parseDayOfWeek("Wednesday") shouldBe WEDNESDAY | |
parseDayOfWeek("Thursday") shouldBe THURSDAY | |
parseDayOfWeek("Friday") shouldBe FRIDAY | |
parseDayOfWeek("Saturday") shouldBe SATURDAY | |
parseDayOfWeek("Sunday") shouldBe SUNDAY | |
parseDayOfWeek("Fritm") shouldBe null | |
parseDayOfWeek("monday") shouldBe MONDAY | |
parseDayOfWeek("tuesday") shouldBe TUESDAY | |
parseDayOfWeek("wednesday") shouldBe WEDNESDAY | |
parseDayOfWeek("thursday") shouldBe THURSDAY | |
parseDayOfWeek("friday") shouldBe FRIDAY | |
parseDayOfWeek("saturday") shouldBe SATURDAY | |
parseDayOfWeek("sunday") shouldBe SUNDAY | |
parseDayOfWeek("fritm") shouldBe null | |
} | |
@Test | |
fun `parse English abbr week`() { | |
parseDayOfWeek("MON") shouldBe MONDAY | |
parseDayOfWeek("TUES") shouldBe TUESDAY | |
parseDayOfWeek("WEDNES") shouldBe WEDNESDAY | |
parseDayOfWeek("WED") shouldBe WEDNESDAY | |
parseDayOfWeek("THURS") shouldBe THURSDAY | |
parseDayOfWeek("THUR") shouldBe THURSDAY | |
parseDayOfWeek("FRI") shouldBe FRIDAY | |
parseDayOfWeek("SATUR") shouldBe SATURDAY | |
parseDayOfWeek("SAT") shouldBe SATURDAY | |
parseDayOfWeek("SUN") shouldBe SUNDAY | |
parseDayOfWeek("FRl") shouldBe null | |
parseDayOfWeek("Mon.") shouldBe MONDAY | |
parseDayOfWeek("Tues.") shouldBe TUESDAY | |
parseDayOfWeek("Wednes.") shouldBe WEDNESDAY | |
parseDayOfWeek("Wed.") shouldBe WEDNESDAY | |
parseDayOfWeek("Thurs.") shouldBe THURSDAY | |
parseDayOfWeek("Thur.") shouldBe THURSDAY | |
parseDayOfWeek("Fri.") shouldBe FRIDAY | |
parseDayOfWeek("Satur.") shouldBe SATURDAY | |
parseDayOfWeek("Sat.") shouldBe SATURDAY | |
parseDayOfWeek("Sun.") shouldBe SUNDAY | |
parseDayOfWeek("Saturn.") shouldBe null | |
parseDayOfWeek("mon.") shouldBe MONDAY | |
parseDayOfWeek("tues.") shouldBe TUESDAY | |
parseDayOfWeek("tue.") shouldBe TUESDAY | |
parseDayOfWeek("wednes.") shouldBe WEDNESDAY | |
parseDayOfWeek("wed.") shouldBe WEDNESDAY | |
parseDayOfWeek("thurs.") shouldBe THURSDAY | |
parseDayOfWeek("thur.") shouldBe THURSDAY | |
parseDayOfWeek("fri.") shouldBe FRIDAY | |
parseDayOfWeek("sat.") shouldBe SATURDAY | |
parseDayOfWeek("sun.") shouldBe SUNDAY | |
parseDayOfWeek("7hur.") shouldBe null | |
} | |
@Test | |
fun `zh char test`() { | |
parseDayOfWeek("一") shouldBe MONDAY | |
parseDayOfWeek("二") shouldBe TUESDAY | |
parseDayOfWeek("三") shouldBe WEDNESDAY | |
parseDayOfWeek("四") shouldBe THURSDAY | |
parseDayOfWeek("五") shouldBe FRIDAY | |
parseDayOfWeek("六") shouldBe SATURDAY | |
parseDayOfWeek("七") shouldBe SUNDAY | |
parseDayOfWeek("日") shouldBe SUNDAY | |
parseDayOfWeek("八") shouldBe null | |
} | |
@Test | |
fun `zh word test`() { | |
parseDayOfWeek("周一") shouldBe MONDAY | |
parseDayOfWeek("周二") shouldBe TUESDAY | |
parseDayOfWeek("周三") shouldBe WEDNESDAY | |
parseDayOfWeek("周四") shouldBe THURSDAY | |
parseDayOfWeek("周五") shouldBe FRIDAY | |
parseDayOfWeek("周六") shouldBe SATURDAY | |
parseDayOfWeek("周七") shouldBe SUNDAY | |
parseDayOfWeek("周日") shouldBe SUNDAY | |
parseDayOfWeek("周八") shouldBe null | |
parseDayOfWeek("星期一") shouldBe MONDAY | |
parseDayOfWeek("星期二") shouldBe TUESDAY | |
parseDayOfWeek("星期三") shouldBe WEDNESDAY | |
parseDayOfWeek("星期四") shouldBe THURSDAY | |
parseDayOfWeek("星期五") shouldBe FRIDAY | |
parseDayOfWeek("星期六") shouldBe SATURDAY | |
parseDayOfWeek("星期七") shouldBe SUNDAY | |
parseDayOfWeek("星期日") shouldBe SUNDAY | |
parseDayOfWeek("星期八") shouldBe null | |
parseDayOfWeek("星期1") shouldBe MONDAY | |
parseDayOfWeek("星期2") shouldBe TUESDAY | |
parseDayOfWeek("星期3") shouldBe WEDNESDAY | |
parseDayOfWeek("星期4") shouldBe THURSDAY | |
parseDayOfWeek("星期5") shouldBe FRIDAY | |
parseDayOfWeek("星期6") shouldBe SATURDAY | |
parseDayOfWeek("星期7") shouldBe SUNDAY | |
parseDayOfWeek("星期8") shouldBe null | |
parseDayOfWeek("周1") shouldBe MONDAY | |
parseDayOfWeek("周2") shouldBe TUESDAY | |
parseDayOfWeek("周3") shouldBe WEDNESDAY | |
parseDayOfWeek("周4") shouldBe THURSDAY | |
parseDayOfWeek("周5") shouldBe FRIDAY | |
parseDayOfWeek("周6") shouldBe SATURDAY | |
parseDayOfWeek("周7") shouldBe SUNDAY | |
parseDayOfWeek("周8") shouldBe null | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment