- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,将输入字符串格式化为html字符串格式
For example, lorem ipsum *dolor sit amet* consectetur **adipiscing** elit.
* is for <i>
** is for <b>
Lorem ipsum <i>dolor sit amet</i>, consectetur <b>adipiscing</b> elit.
val input = "Lorem ipsum *dolor sit amet*, consectetur **adipiscing** elit."
val tagMap = mapOf(
'*' to "<i>",
'♥' to "<b>",
'♦' to "<s>"
)
val tagMapClose = mapOf(
'*' to "</i>",
'♥' to "</b>",
'♦' to "</s>"
)
fun tagCheck(obj: String): String {
var str = Regex("""\*\*""").replace(obj, "♥")
str = Regex("""~~""").replace(str, "♦")
str = Regex("""\*\*\*""").replace(str, "♥*")
val charList = str.toList()
var res = ""
val indexMap = mutableMapOf<Int, String>()
var ct = 0
for ((tag, define) in tagMap) {
val tagIndex = mutableListOf<Int>()
var status = true
for (char in charList) if (char == tag) tagIndex.add(charList.indexOf(char))
ct = if (tagIndex.size % 2 == 1) tagIndex.size
else tagIndex.size + 1
for (i in 0 until ct - 1) {
if (status) {
indexMap[tagIndex[i]] = tagMap.getValue(tag)
status = false
}
else if (!status) {
indexMap[tagIndex[i]] = tagMapClose.getValue(tag)
status = true
}
}
}
for (item in charList) {
res += if (indexMap.keys.contains(charList.indexOf(item))) indexMap[charList.indexOf(item)]
else item
}
return res
}
Lorem ipsum </i>dolor sit amet</i>, consectetur </b>adipiscing</b> elit.
最佳答案
我强烈建议改用markdown解析器。这些可能更准确,并且比正则表达式受边缘情况的影响要小。
话虽如此,您可以使用正则表达式进行解析。但是,由于处理 token 的方式,您的方法失败了。您可以将 Markdown 标记分配给不同的统一标记(仅这是不必要的转换),然后将相同的标记分配给两个不同的结束标记。那和循环可能使所有标签最终以结束标签结束。
存储 token 不是一个坏主意,因此让我们从此开始。在**
和b
以及*
和i
之间创建连接。无需将***
转换为bi
-最后,解析将逐步进行转换,并将***content***
首先转换为<b>*content*</b>
,然后将其转换为<b><i>content</b></i>
。在这种情况下,我通过正则表达式进行映射,以使其以后变得更容易:
val tokens = mapOf(
"\\*\\*" to "b", "\\*" to "i", "~~" to "s"
)
正则表达式本身更复杂:
val core = "(?<!\* )(?=\S)(.+?[*]*)(?<=\S)(?<! \*)"
请注意,单独使用
不能单独使用。第一组和最后一组是为了避免将
*** something***
解析为有效的,因为
*
也是内部的有效字符。
var string: String
,但是您当然可以用其他替换它。这只是为了可移植性。
var string = "***this*** **is** a ***test of* a markdown *regex* parsing system** that I really **hope *works* like it's supposed to**. " +
"And an ** invalid one **, and not to forget ~~the broken regex~~ the perfect regex"
for ((token, html) in tokens) { // if you don't know, Map entries can be unpacked like tuples. The token is for an instance **, and html is b
val modRegex = "$token$core$token".toRegex() // Construct the regex. This is why the format in the map is regex-style
string = string.replace(modRegex, "<$html>$1</$html>")//And finally, we replace it. The String templates ensure the right match, `$1` is the first capture group to avoid losing content
}
为了演示,我还打印了
string
:
<b><i>this</i></b> <b>is</b> a <b><i>test of</i> a markdown <i>regex</i> parsing system</b> that I really <b>hope <i>works</i> like it's supposed to</b>. And an ** invalid one **, and not to forget <s>the broken regex</s> the perfect regex
this is a test of a markdown regex parsing system that I really hope works like it's supposed to. And an ** invalid one **, and not to forget
the broken regexthe perfect regex
()[]
需要围绕HTML移动组才能起作用,并且有两个相关的组。
($1)[$2]
->
<a href="$1">$2</a>
,这再次忽略了URL上的替代文本。
关于kotlin - 功能答案不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53803839/
我正在查看Kotlin Github page我注意到 Kotlin 语言本身大部分是用 Kotlin 编写的:我只是想知道,一种语言怎么可能大部分都是用它自己的语言编写的?在您可以使用正在创建的语言
我有以下非常简单的 kotlin 代码来演示中缀函数 com.lopushen.demo.presentation 包 fun main(args: Array) { print("Hello
我在 Java 中有 2 个模型类,其中一个扩展了另一个 @UseStag public class GenericMessages extends NavigationLocalizationMap
Kotlin 代码 runBlocking { flow { for (i in 0..4) { println("Emit $i")
这三个 Kotlin 插件和它们的实际作用有什么区别? plugins { id 'kotlin-android' id 'org.jetbrains.kotlin.android'
我正在为某些现有库添加 Kotlin 原生 linuxX64 目标支持。库已成功编译,但在运行测试用例时,出现以下运行时错误: kotlin.native.concurrent.InvalidMuta
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我创建了一个类并向其添加了一个与成员函数具有相同签名的扩展,并执行了这个方法,它总是执行成员方法。 class Worker { fun work() = "...working" } fun
我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说一直是个问题。在下面的示例代码中,我想通过使用函数“changeNum”修改变量“num”的值。但当然,Kotlin
现在,我正在尝试用 Kotlin 重写我的 Java 应用程序。然后,我遇到了日志语句,比如 log.info("do the print thing for {}", arg); 所以我有两种方法可
有点出名article关于许多语言的异步编程模型的状态,指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步。以下是这种语言的属性: 每个函数都有一种颜色,红色或蓝色(例如asy
因为 KDoc 文档生成引擎是 abandoned in favor of Dokka , Kotlin 文档应该称为“KDoc 注释”,还是“Dokka 注释”? 最佳答案 如所述here , KD
我想在可空对象上传递函数引用。以 Android 为例,假设我想使用 Activity#onBackPressed来自作为该事件的子级的片段。 如果我想调用这个函数,我可以很容易地做到 activit
我有一个列表 (x, y)其中y只能是 0 或 1 这样 例如: [(3, 0), (3, 1), (5, 1)] [(5, 0), (3, 1), (5, 1)] [(1, 1), (3, 1),
从强类型语言的定义来看: A strongly-typed programming language is one in which each type of data (such as intege
这不能编译的事实是否意味着它们不是一流的类型? fun foo(s: String): Int = s.length // This won't compile. val bar = foo 有没有办
如果在 Java i++是一个表达式和 i++;是一个表达式语句,分号(;) 在 Kotlin 中是可选的,是 i++ Kotlin 中的表达式或表达式语句? 最佳答案 i++是一个表达式,因为它有一
代码(如下所示)是否正确?它取自 Kotlin-docs.pdf 的第 63 页,这也是 https://kotlinlang.org/docs/reference/generics.html 的最后
我正在尝试使用 Kotlin 为 Android 的一些全局 API 解析器(检查网络连接、调用 API 并通过来自源的单个调用返回格式化数据),并且在某些时候我不得不创建一个通用类型 object就
kotlinlang 中的任务: 使用月份变量重写此模式,使其与格式 13 JUN 1992(两位数字、一个空格、一个月份缩写、一个空格、四位数字)中的日期相匹配。 答案是:val month = "
我是一名优秀的程序员,十分优秀!