String 使用Scala检测不可打印字符的字符串中的索引
我有一个方法可以检测字符串中不可打印的索引,如下所示String 使用Scala检测不可打印字符的字符串中的索引,string,scala,String,Scala,我有一个方法可以检测字符串中不可打印的索引,如下所示 def isPrintable(v:Char) = v >= 0x20 && v <= 0x7E val ba = List[Byte](33,33,0,0,0) ba.zipWithIndex.filter { v => !isPrintable(v._1.toChar) } map {v => v._2} > res115: List[Int] = List(2, 3, 4) def可打印(
def isPrintable(v:Char) = v >= 0x20 && v <= 0x7E
val ba = List[Byte](33,33,0,0,0)
ba.zipWithIndex.filter { v => !isPrintable(v._1.toChar) } map {v => v._2}
> res115: List[Int] = List(2, 3, 4)
def可打印(v:Char)=v>=0x20&&v!可打印(v._1.toChar)}map{v=>v._2}
>res115:List[Int]=List(2,3,4)
结果列表的第一个元素是索引,但我想知道是否有更简单的方法来实现这一点 仅获取满足给定条件的第一个索引:
ba.indexWhere(v => !isPrintable(v.toChar))
(如果未找到任何内容,则返回-1)仅获取满足给定条件的第一个索引:
ba.indexWhere(v => !isPrintable(v.toChar))
(如果未找到任何字符,则返回-1)如果需要第一个不可打印字符(如果存在)的
选项[Int]
,则可以执行以下操作:
ba.zipWithIndex.collectFirst{
case (char, index) if (!isPrintable(char.toChar)) => index
}
> res4: Option[Int] = Some(2)
如果您想要示例中的所有索引,只需使用
collect
而不是collectFirst
,您将得到一个列表
如果您想要第一个不可打印字符(如果存在)的选项[Int]
,您可以执行以下操作:
ba.zipWithIndex.collectFirst{
case (char, index) if (!isPrintable(char.toChar)) => index
}
> res4: Option[Int] = Some(2)
如果您想要像您的示例中那样的所有索引,只需使用
collect
而不是collectFirst
,您将得到一个列表
,如果需要,只会返回第一次出现的不可打印字符
方法span
应用于列表
可提供两个子列表,第一个子列表中所有元素都持有一个条件,第二个子列表以伪造条件的元素开始。在这种情况下考虑,
val (l,r) = ba.span(b => isPrintable(b.toChar))
l: List(33, 33)
r: List(0, 0, 0)
要获取第一个不可打印字符的索引
l.size
res: Int = 2
如果需要,所有出现的不可打印字符 考虑给定
列表
的分区
作为标准。比如说,
val ba2 = List[Byte](33,33,0,33,33)
val (l,r) = ba2.zipWithIndex.partition(b => isPrintable(b._1.toChar))
l: List((33,0), (33,1), (33,3), (33,4))
r: List((0,2))
其中,
r
包括具有不可打印字符的元组,以及它们在原始列表中的位置,如果需要,只包括第一次出现的不可打印字符
方法span
应用于列表
可提供两个子列表,第一个子列表中所有元素都持有一个条件,第二个子列表以伪造条件的元素开始。在这种情况下考虑,
val (l,r) = ba.span(b => isPrintable(b.toChar))
l: List(33, 33)
r: List(0, 0, 0)
要获取第一个不可打印字符的索引
l.size
res: Int = 2
如果需要,所有出现的不可打印字符 考虑给定
列表
的分区
作为标准。比如说,
val ba2 = List[Byte](33,33,0,33,33)
val (l,r) = ba2.zipWithIndex.partition(b => isPrintable(b._1.toChar))
l: List((33,0), (33,1), (33,3), (33,4))
r: List((0,2))
其中,
r
包括带有不可打印字符的元组及其在原始列表中的位置我不确定是否需要索引列表或元组列表,也不确定“ba”是否需要字节列表或以字符串开头
for { i <- 0 until ba.length if !isPrintable(ba(i).toChar) } yield i
我不确定是否需要索引或元组列表,也不确定“ba”是否需要字节列表或以字符串开头
for { i <- 0 until ba.length if !isPrintable(ba(i).toChar) } yield i
您可以直接使用regexp通过unicode代码点查找无法打印的字符
资源:
通过这种方式,您可以直接使用这种模式筛选字符串,例如:
val text = "this is \n sparta\t\r\n!!!"
text.zipWithIndex.filter(_._1.matches("\\p{C}")).map(_._2)
> res3: Vector(8, 16, 17, 18)
结果,您将得到字符串中所有不可打印字符的索引向量。查看它您可以直接使用regexp通过unicode代码点查找不可打印的字符
资源:
通过这种方式,您可以直接使用这种模式筛选字符串,例如:
val text = "this is \n sparta\t\r\n!!!"
text.zipWithIndex.filter(_._1.matches("\\p{C}")).map(_._2)
> res3: Vector(8, 16, 17, 18)
结果,您将得到字符串中所有不可打印字符的索引向量。检查它这不是只返回一个索引吗?如果我没记错的话,停下来看第一个发现。我以为OP意味着得到第一个索引?我想他想要所有的:>res115:List[Int]=List(2,3,4)
他说“结果列表的第一个元素是索引…”-1。为什么这么匆忙?一行没有上下文或讨论的代码几乎永远都不是一个好答案,而且它甚至不像第一次发布的那样有效。这不是只返回一个索引吗?如果我没记错的话,停下来看第一个发现。我以为OP意味着得到第一个索引?我想他想要所有的:>res115:List[Int]=List(2,3,4)
他说“结果列表的第一个元素是索引…”-1。为什么这么匆忙?没有上下文或讨论的一行代码几乎永远都不是一个好的答案,这甚至不像第一次发布的那样有效。val ba=List[Byte](33,33,0,33,33)
将使您的测试失败val ba=List[Byte](33,33,0,33,33)
将使您的测试失败对于一个列表(O(i)复杂度而言,A(i)是昂贵的。您必须首先将其转换为Vector(在这里的文档中检查“性能”)。您完全正确,但我不确定作者是否真的想首先使用列表。这个问题被表述为“检测字符串中的索引”ba属于List类型,在任何情况下:)ba(i)对于List来说是昂贵的(O(i)复杂性)。您必须首先将其转换为Vector(在这里的文档中检查“性能”)。您完全正确,但我不确定作者是否真的想首先使用列表。该问题的措辞为“检测字符串中的索引”ba属于列表类型,在任何情况下:)