正则表达式提取@#(@人,话题)

正则表达式提取@#(@人,话题),第1张

/// 点击的文本类型

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文本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9660262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存