/// 点击的文本类型
enumTapRichTextType:Int{
casenone =0 // 没有点击
caseuser =1 // 点击了用户
caselink =2 // 点击了链接
casetopic =3 // 点击了话题
}
classRichLabel:UILabel{
overridevarattributedText:NSAttributedString {
didSet{
// 把文本设置为可变的
letattributedString =NSMutableAttributedString(attributedString:attributedText!)
// 添加属性
attributedStringaddAttribute(font, value:font, range:NSRange(location:0, length: attributedStringlength))
// 设置 textStorage 的文本内容
textStoragesetAttributedString(attributedString)
// 匹配用户名
userRanges=ranges(from:"@:")
_=userRangesmap{textStorageaddAttribute(foregroundColor, value:UIColorblueFontColor(), range: $0) }
// 匹配话题
topicRanges=ranges(from:"##")
_=topicRangesmap{textStorageaddAttribute(foregroundColor, value:UIColorblueFontColor(), range: $0) }
// 匹配链接
linkRanges=rangesOfLink()
_=linkRangesmap{textStorageaddAttribute(foregroundColor, value:UIColorblueFontColor(), range: $0) }
}
}
overridefuncdrawText(in rect:CGRect) {
// 绘制字形,设置需要绘制的范围
letrange =NSRange(location:0, length:textStoragelength)
layoutManagerdrawGlyphs(forGlyphRange: range, at: zero)
}
overrideinit(frame:CGRect) {
superinit(frame: frame)
// 设置文本
setupText()
}
requiredinit(coder aDecoder:NSCoder) {
superinit(coder: aDecoder)
// 设置文本
setupText()
}
/// 文本容器,文本可以排版的区域,默认是矩形,可以自定义区域大小
privatelazyvartextContainer =NSTextContainer()
/// 布局管理者,负责对文字进行编辑排版处理,将存储在 NSTextStorage 中的数据转换为可以在视图控件中显示的文本内容
/// 并把字符编码映射到对应的字形上,然后将字形排版到 NSTextContainer 定义的区域中。
privatelazyvarlayoutManager =NSLayoutManager()
/// NSMutableAttributeString 的子类,主要用来存储文本的字符和相关属性
/// 当 NSTextStorage 中的字符或属性发生改变时,会通知 NSLayoutManager,进而做到文本内容的显示更新。
privatelazyvartextStorage =NSTextStorage()
/// 记录用户名的范围
privatelazyvaruserRanges = [NSRange]()
/// 记录链接的范围
privatelazyvarlinkRanges = [NSRange]()
/// 记录话题的范围
privatelazyvartopicRanges = [NSRange]()
/// 定义一个闭包,点击回调
typealiasTapRichText = (String,NSRange) -> ()
varuserTapped:TapRichText
varlinkTapped:TapRichText
vartopicTapped:TapRichText
/// 点击的类型
privatevartapRichTextType:TapRichTextType= none
/// 记录用户点击的 range
varselectedRange =NSRange()
}
extension RichLabel {
/// 设置文本
privatefuncsetupText() {
// 将 layoutManager 添加到 textStorage 中
layoutManageraddTextContainer(textContainer)
// 将 textContainer 添加到 layoutManager 中
textStorageaddLayoutManager(layoutManager)
// 设置可以与用户交互
isUserInteractionEnabled = true
// 间距设置 0
textContainerlineFragmentPadding = 00
}
overridefunclayoutSubviews() {
superlayoutSubviews()
// 设置容器的大小为 当前 label 的尺寸
textContainersize = framesize
}
funcrangesOfLink() -> [NSRange] {
// 检测正则表达式,NSDataDetector 是 NSRegularExpression 的子类
let regex = try! NSDataDetector(types: NSTextCheckingResultCheckingTypelinkrawValue)
returnresults(from: regex)
}
/// 返回正则表达式匹配的结果范围
funcranges(from pattern:String) -> [NSRange] {
// 创建正则表达式对象
letregex =try!NSRegularExpression(pattern: pattern, options: [])
returnresults(from: regex)
}
/// 返回正则表达式的结果
privatefuncresults(from regex:NSRegularExpression) -> [NSRange] {
// 开始匹配,返回结果
letcheckingResults = regexmatches(in:textStoragestring, options: [], range:NSRange(location:0, length:textStoragelength))
returncheckingResultsmap({ $0range})
}
/// 根据点击的坐标,获取范围
privatefuncrange(of point:CGPoint) ->NSRange{
// 判断 textStorage 长度是不是 0
iftextStoragelength==0{returnNSRange() }
// 在 textStorage 中的索引
letindex =layoutManagerglyphIndex(for: point, in:textContainer)
// 获取用户名的范围
foruserRangeinuserRanges{
ifindex > userRangelocation&& index < userRangelocation+ userRangelength{
tapRichTextType= user
returnuserRange
}
}
// 获取链接的范围
forlinkRangeinlinkRanges{
ifindex > linkRangelocation&& index < linkRangelocation+ linkRangelength{
tapRichTextType= link
returnlinkRange
}
}
// 获取话题的范围
fortopicRangeintopicRanges{
ifindex > topicRangelocation&& index < topicRangelocation+ topicRangelength{
tapRichTextType= topic
returntopicRange
}
}
returnNSRange()
}
/// 从 range 数组里返回一个 range
/// 暂未使用
funcrange(from ranges: [NSRange], index:Int) ->NSRange{
// 获取话题的范围
foriteminranges {
ifindex > itemlocation&& index < itemlocation+ itemlength{returnitem }
}
returnNSRange()
}
}
extension RichLabel {
overridefunctouchesBegan(_touches:Set, with event:UIEvent) {
// 获取点击的范围
selectedRange=range(of: touchesfirst!location(in:self))
// 获取点击的范围的内容
letcontent = (textStoragestringasNSString)substring(with:selectedRange)
// 判断点击的类型
switch tapRichTextType {
caseuser:
userTapped(content,selectedRange)
caselink:
linkTapped(content,selectedRange)
casetopic:
topicTapped(content, selectedRange)
default:
break
}
}
}
下拉框包含多项,用comboBox1Items[n]可以读取下拉框某一项的文本(n代表索引)。
比如索引与下拉框文本的文本关系如下:
0 ABC
1 DOC
2 PPT
那么用comboBox1Items[0]ToString()获取的文本是ABC,则comboBox1Items[1]ToString()获取的文本是DOC,按此类推
如果要获取comboBox当前选择的项,可以用:
comboBox1Items[comboBox1SelectIndex]ToString()
或者:
comboBox1Text
使用windowgetSelection()getRangeAt(0)toString();
注意window对象,iframe中的选中使用相应的window对象
定位光标的话,有些可以使用focus函数。对于不可编辑的区域要使用Range对象。
然后windowgetSelection()removeAllRanges();//去除现有的光标(选中区域)
windowgetSelection()addRange(Range对象);//添加选中区域选中的范围
相信有不少windows7系统用户遇到过这样的情况,在浏览器打开的网页中,不是所有的文字内容并非是文本的,而是以的形式显示或者是PDF的形式,这时如果发现其中有自己想要的内容,就只能自己手工录入下来,很麻烦。有没有好的方法能直接提取出自己所需的文字呢?下面的我就以win764位旗舰版系统为例告诉大家文字怎么提取?
上述问题可以通过OCR识别的方式来解决。这一方法中有个问题,就是必须先获取,并且要裁剪编辑一番,然后才能通过文中介绍的工具进行提取,比较费时费力。所以,更便捷的解决方案,就是找到一种能够直接截屏识别工具,那样就方便多了。
解决方法:
“CoCo图像识别”非常符合上述的要求,它可以像QQ截图一样直接截取当前屏幕的图像,并即时将图像中的文字转换成可复制的文本。软件启动后是一个很简洁的界面(图1)推荐:CoCo图像转换成word文字识别工具绿色版下载
点击“选择区域”按钮,接下来就跟大家常用的QQ截图方法一样,选取屏幕中需要文字识别的图像区域,然后将出现屏幕识别窗口,根据实际情况设置“内容”、“背景”及“语种”,它支持的语种有中文简体、繁体、手写体,以及英文、韩文、日文等,根据情况选择。最后点击“确定”即可快速完成识别。
如果想要截图识别的是整个屏幕,不希望被CoCo本身的窗口所遮挡,可以先点击“隐藏”将CoCo隐藏,然后再通过Ctrl+F5键来调用识别功能, *** 作同样非常简单
以上就是关于正则表达式提取@#(@人,话题)全部的内容,包括:正则表达式提取@#(@人,话题)、C#如何读取下拉框的文本、js如何获得当前li下的span文本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)