矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: JuncoJet

有想学编程的吗,可以接龙,不是灌水认真脸

[复制链接]
     
发表于 2024-9-7 23:44:23 | 显示全部楼层
大神啊,基本都会啦。
正则表达式 通俗讲是什么
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-7 23:59:01 | 显示全部楼层
ITOUR 发表于 2024-9-7 23:44
大神啊,基本都会啦。
正则表达式 通俗讲是什么


非常有用途的东西
abc123ef578
这里面有数字有字母
VIM命令 :%s/\d//g  :%s/\D//g
可以去除字母,保留数字,可以去除数字保留字母
或者几万行文字里,提取想要关键词的行
VIM命令 :v/关键词/d
去除几万行文本中空白行
:g/^[\s|\t]\+$/d
靠人工肯定是不可能做的
这种靠word也是做不到的,正则表达式灵活方便
回复 支持 1 反对 0

使用道具 举报

     
发表于 2024-9-8 00:14:00 | 显示全部楼层
谢谢 这是一个全新的概念 哈哈 谢谢
回复 支持 反对

使用道具 举报

发表于 2024-9-8 10:11:59 来自手机 | 显示全部楼层
xyn1 发表于 2024-9-7 15:38
坛友好,请教您,想通过电脑3.5话筒接口,在Windoes上开发一个应用,具体就是话筒接口两根线,断开,接通, ...

試試看
#include <windows.h>
#include <mmsystem.h>
#include <iostream>

#pragma comment(lib, "winmm.lib")

// Callback function to handle device change events
void CALLBACK DeviceChangeCallback(
    HWAVEIN hwi,
    UINT uMsg,
    DWORD_PTR dwInstance,
    DWORD_PTR dwParam1,
    DWORD_PTR dwParam2
) {
    if (uMsg == MM_WIM_OPEN) {
        // Microphone was plugged in
        MessageBox(NULL, "Microphone plugged in", "Notification", MB_OK);
    } else if (uMsg == MM_WIM_CLOSE) {
        // Microphone was unplugged
        MessageBox(NULL, "Microphone unplugged", "Notification", MB_OK);
    }
}

// Entry point of the application
int main() {
    WAVEINCAPS waveInCaps;
    MMRESULT result;

    // Check the number of wave input devices
    UINT numDevices = waveInGetNumDevs();
    if (numDevices == 0) {
        MessageBox(NULL, "No wave input devices available.", "Error", MB_OK);
        return 1;
    }

    // Get information about the first device
    result = waveInGetDevCaps(0, &waveInCaps, sizeof(WAVEINCAPS));
    if (result != MMSYSERR_NOERROR) {
        MessageBox(NULL, "Failed to get wave input device capabilities.", "Error", MB_OK);
        return 1;
    }

    // Open the wave input device
    HWAVEIN hWaveIn;
    result = waveInOpen(&hWaveIn, 0, NULL, (DWORD_PTR)DeviceChangeCallback, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) {
        MessageBox(NULL, "Failed to open wave input device.", "Error", MB_OK);
        return 1;
    }

    // Run a message loop to process events
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // Close the wave input device
    waveInClose(hWaveIn);
    return 0;
}
回复 支持 反对

使用道具 举报

     
发表于 2024-9-8 14:51:11 | 显示全部楼层
本帖最后由 scu319hy 于 2024-9-8 16:17 编辑
ITOUR 发表于 2024-9-7 23:44
大神啊,基本都会啦。
正则表达式 通俗讲是什么


正则表达式是乔老爷发明的形式语言中的第三种文法形式,因为它是线性的,也称做线性文法/语言
可以认为“正则表达式”是一种描述能力最差的编程语言

举个最简单的例子:
a*
其中"a"代表"字母a",*代表允许它前面的句柄(匹配规则)重复0到无限次
那么这个正则表达式就代表任意多个a字符的字符串

再看个例子:
Aa*B
同上,a*是"意多个a字符",这个正则表达式加了两个限定,必须要以大写字母"A"开头,大写字母"B"结尾

上面的例子非常好理解,正则表达式就是按规则逐个去匹配目标字符串,匹配成功后,再向后去匹配下一个字符。
但这个过程要做一个决策,如果当前的规则和下一个规则都可以匹配,那要用哪个规则来匹配?这就引入了一个优先级的问题。
(注:标准的正则表达不存在这个问题,但表达能力太弱,现在的各种实现早已经超过了它的限制)

比如:
a*a
在匹配的时候,到底是用"a*"还是最后的"a"来匹配呢?
现在的正则表达式引擎一般会采用"a*"来匹配(*的优先级最高),但这样会带来个问题,最后的"a"无法匹配了
于是,又引入了“回溯”的逻辑,当匹配失败(无法找到结尾的a)时,会退回上一次的位置重试,直到无法回退

上面例子中的具体字符"a"被叫做终结符,即最终的匹配规则,它会具体对应到一个最终的字符"a"。
而"*"则叫量词,代表它前面的句柄可以重复多少次,几个常用的量词:
*: 匹配0个或多个,尽可能多匹配(贪婪匹配)
+: 匹配1个或多个,尽可能多匹配(贪婪匹配)
?: 匹配0个或1个,尽可能少匹配(非贪婪匹配)
*?: 匹配0个或多个,尽可能少匹配(非贪婪匹配)
+?: 匹配1个或多个,尽可能少匹配(非贪婪匹配)

除了具体的字符,假如我们想匹配一些不确定的字符时,需要用到通配符".",它可以代表任意(在不同模式下有不同的限制)不同字符
比如:
A.*B
就代表了以A开头B结尾的任意字符串
很多时候,我们想要自己定义一些通配范围,这时就必须自己定义一个通配集合
在正则表达式中,我们通过"[","]"来定义集合
比如:
[abcdefg]
代表了a到g的任意一个字符
[abcdefg]+
就代表了a到g字符组成的长度大于1的字符串
有的时候,写出所有的集合内容会很麻烦,可以简化成如下形式:
[a-g]
这就和[abcdefg]是等价的
甚至可以写多个分段,比如:
[a-z0-9]
它代表了a-z及0-9的所有字符

大多数的正则表达式引擎会内建一些基本的集合,方便我们使用,比如:
\s:代表空白字符,空格,跳格等
\S:代表非空白字符
\d:代表数字[0-9]
\D:代表非数字
\w: 代表英文字母,数字和下划线
\W: 代表非英文字母,数字和下划线
每个正则表达式引擎还会有很多其它的预定义集合,需要查看它的文档

如下正则表达式:
hello\s+world!
可以匹配
"hello world!"
"hello    world!"
"hello      world!"
....

假如我们希望匹配规则中的一段内容被重复,而不是一个字符/集合,这就要用到分组
如下:
(ab)*
用小括号标记的规则段会被当做一个整体(句柄)重复0到多次
它可以匹配,任意个"ab"组成的字符串

再回到前一个例子,如果我们希望hello world或hi world都被匹配,就需要用的逻辑或
如下:
(hello|hi)\s+world!
第一个单词可以是hello也可以是hi,再连接后面的规则。这样一来,"hi world!"也是可被接受的了
需要注意的是,如果不用小括号分组,这个表达式的意义就变成了“hello”或"hi\s+world!"...

到此,正则表达式的所有基本语法已经结束

但光能匹配还不够,很多时候我们匹配了个字符串是为了从中提取我们想要到部分,或是把它们变成我们希望的形式
用正则表达式匹配再去替换是可以解决一些问题,但有些场景不满足需求,如下:
Date:\s*\d+-\d+-\d+
可以匹配字符串“Date: 2024-09-08”,我们想把其中的日期提取出来,怎么办?
这时前面讲过的分组就可以起到标记的作用,它会记录下匹配项的位置供后续使用,比如:
Date:\s*(\d+-\d+-\d+)
在匹配成功后,正则表达式引擎会记录下时间的位置,并保存到分组1的结果里。
在很多编辑器的替换功能里,可以用分组编号来引用它,比如:
Date:\s*(\d+-\d+-\d+) 替换为 <\1>
则:
Date: 2024-09-08 会变为 <2024-09-08>
这样,我们就可以实现批量编辑文本,只要支持正则表达式的编辑器都可以干这个,并不是VIM的专利
(注:多数编辑器是用这种语法,具体需要参考相关文档)

以上是最基本的正则表达式语法和应用场景。
看上去挺复杂,其实只要几百行代码就可以实现以上的逻辑
只要认真学习了编译原理前三章的人都应该有能力写出来
它背后的理论基础--形式语言,在逻辑上是和状态机完全等价的。
任何程序都可以用形式语言表达出来。

乔老爷做为一个语言学家,他的这项研究远远超前于计算机及相关理论的发展
可以说给他发图灵奖都是图灵奖的荣幸...毕竟先有形式语言再有图灵奖

补充内容 (2024-9-9 11:24):
前文有错,勘误:
?: 匹配0个或1个,应该是 尽可能多匹配(贪婪匹配)
??: 匹配0个或1个,应该是 尽可能少匹配(非贪婪匹配)
回复 支持 反对

使用道具 举报

     
发表于 2024-9-9 08:56:36 | 显示全部楼层
Verilog如何?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-9 09:17:44 | 显示全部楼层

FPGA玩过几天 ,国产的高云FPGA(荔枝糖4K)
会点灯,会边沿触发,会看能耗,其他不会了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-9 09:20:29 | 显示全部楼层
本帖最后由 JuncoJet 于 2024-9-9 09:26 编辑
scu319hy 发表于 2024-9-8 14:51
正则表达式是乔老爷发明的形式语言中的第三种文法形式,因为它是线性的,也称做线性文法/语言
可以认 ...


正则涉及两种或者更多的语法
a*?
a\{-,}
两种非贪婪匹配语法相差很远
回复 支持 反对

使用道具 举报

     
发表于 2024-9-9 09:55:30 | 显示全部楼层
vc实现串口RS232,485通信程序,这个怎么写?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-9 10:02:58 | 显示全部楼层
bqx211 发表于 2024-9-9 09:55
vc实现串口RS232,485通信程序,这个怎么写?

VC没写过
QT  QtSerialPort

Image 1030.jpg
Image 1031.jpg
回复 支持 反对

使用道具 举报

     
发表于 2024-9-9 10:08:05 | 显示全部楼层
JuncoJet 发表于 2024-9-9 10:02
VC没写过
QT  QtSerialPort

这个生成的可执行程序有吗?发一个?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-9 10:11:23 | 显示全部楼层
bqx211 发表于 2024-9-9 10:08
这个生成的可执行程序有吗?发一个?

Si4732 上机位软件
http://www.crystalradio.cn/forum ... &fromuid=272612
(出处: 矿石收音机论坛)
回复 支持 反对

使用道具 举报

     
发表于 2024-9-9 10:27:27 | 显示全部楼层
我不懂你这个,能发一个可执行文件吗?106227544@qq.com
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-9 10:29:38 | 显示全部楼层
bqx211 发表于 2024-9-9 10:27
我不懂你这个,能发一个可执行文件吗?

11楼直接下载就行
http://www.crystalradio.cn/forum ... &fromuid=272612

https://jcjt.lanzoux.com/ihLf8jtxzcd
连接时先选择config里的串口,然后点击connect连接
部分功能尚不完善,可以使用console里手动输入命令
调台暂时只支持上下键,音量左右键
左键seek可以自动向上搜台,右键seek向下搜台
回复 支持 反对

使用道具 举报

     
发表于 2024-9-9 11:23:17 | 显示全部楼层
JuncoJet 发表于 2024-9-9 09:20
正则涉及两种或者更多的语法
a*?
a\{-,}

因为正则表达式没有标准,各种实现的语法多种多样
行业事实标准就是Perl的实现
应用最广的就是PCRE(Perl Compatible Regular Expressions/Perl兼容正则表达式)
经过多年发展,它其实也有一些私货了
你说的区别主要是量词的几种写法,这个在Perl里都有
* 等价于 {0,}
+ 等价于 {1,}
? 等价于 {0,1}
*? 等价于 {0,}?
+? 等价于 {1,}?
但这种写法可以做更精确的限定,比如:
a{10,100}
是明确限定a可重复10次到100次
a{10,10}
明确限定a可重复10次
可简写为a{10}

但你写的\{-,}这种,有可能是哪个实现的变体,我没有见过
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表