Question:
I get this issue for several hours.
Why (HP)(A)->H
does NOT match [^a-zA-Z0-9]A[^a-zA-Z0-9]
in Kotlin?
regexr website
Expression1
/[^a-zA-Z0-9]A[^a-zA-Z0-9]/g
Text
(HP)(A)->H
Result
(A)
Expression2
/[^a-zA-Z0-9]A[^a-zA-Z0-9]/gy
Text
(HP)(A)->H
Result
no result
Regex
class in Kotlin
In VSC
Code
test1.kt
fun exactlyMatch(target:String,entryForReplacement:Pair<String,String>){
val nonLetterOrDigit = "[^a-zA-Z0-9]"
val (key,value) = entryForReplacement
val keyRegexString = nonLetterOrDigit + key + nonLetterOrDigit
val keyRegEx = Regex(keyRegexString)
val matched = keyRegEx.matches(target)
println("target:${target},key:${key},value:${value},keyRegEx.pattern:${keyRegEx.pattern},matched:${matched}")
}
fun main(){
val target = "(HP)(A)->H"
val mapForReplacement : Map<String,String> = mapOf("A" to "Aura:Green","HP" to "HP:75","H" to "healthStatus")
val mapForReplacementList = mapForReplacement.toList()
println("mapForReplacementList:${mapForReplacementList}")
var entryForReplacement: Pair<String,String>
for(entryForReplacement in mapForReplacementList){
exactlyMatch(target,entryForReplacement)
}
}
Result after execution
PS C:Users{USERNAME}OneDrive桌面TibaMeKotlinTHE BIG NERD RANCH GUIDECH3> kotlinc test1.kt -include-runtime -d test1.jar
PS C:Users{USERNAME}OneDrive桌面TibaMeKotlinTHE BIG NERD RANCH GUIDECH3> java -jar test1.jar
mapForReplacementList:[(A, Aura:Green), (HP, HP:75), (H, healthStatus)]
target:(HP)(A)->H,key:A,value:Aura:Green,keyRegEx.pattern:[^a-zA-Z0-9]A[^a-zA-Z0-9],matched:false
target:(HP)(A)->H,key:HP,value:HP:75,keyRegEx.pattern:[^a-zA-Z0-9]HP[^a-zA-Z0-9],matched:false
target:(HP)(A)->H,key:H,value:healthStatus,keyRegEx.pattern:[^a-zA-Z0-9]H[^a-zA-Z0-9],matched:false
[]
(https://i.sstatic.net/oJ2amRsA.png)
In Kotlin online active shell
Code
fun exactlyMatch(target:String,entryForReplacement:Pair<String,String>){
val nonLetterOrDigit = "[^a-zA-Z0-9]"
val (key,value) = entryForReplacement
val keyRegexString = nonLetterOrDigit + key + nonLetterOrDigit
val keyRegEx = Regex(keyRegexString)
val matched = keyRegEx.matches(target)
println("target:${target},key:${key},value:${value},keyRegEx.pattern:${keyRegEx.pattern},matched:${matched}")
}
fun main(){
val target = "(HP)(A)->H"
val mapForReplacement : Map<String,String> = mapOf("A" to "Aura:Green","HP" to "HP:75","H" to "healthStatus")
val mapForReplacementList = mapForReplacement.toList()
println("mapForReplacementList:${mapForReplacementList}")
var entryForReplacement: Pair<String,String>
for(entryForReplacement in mapForReplacementList){
exactlyMatch(target,entryForReplacement)
}
}
main()
Result after execution
mapForReplacementList:[(A, Aura:Green), (HP, HP:75), (H, healthStatus)]
target:(HP)(A)->H,key:A,value:Aura:Green,keyRegEx.pattern:[^a-zA-Z0-9]A[^a-zA-Z0-9],matched:false
target:(HP)(A)->H,key:HP,value:HP:75,keyRegEx.pattern:[^a-zA-Z0-9]HP[^a-zA-Z0-9],matched:false
target:(HP)(A)->H,key:H,value:healthStatus,keyRegEx.pattern:[^a-zA-Z0-9]H[^a-zA-Z0-9],matched:false
[]
Other info
IDE: VSC
Kotlin plugin: []
What I tried?
-
I have test these expression in regexr website.
-
Kotlin docs
Also, I visit Kotlin API reference to know how to use them.
-
Regex
class
Regex
class -
matches
method inRegex
class
2
The documentation of Regex.matches
that you linked states the following:
Indicates whether the regular expression matches the entire input.
So keyRegEx.matches(target)
will only be true if the entire target
string matches the regex, which is not the case here, as you can confirm on the regexr website.
If you want to find a match within a bigger string, you can use find instead.