当前位置:主页>销售管理软件> 列表

求一个字符串中查找带*号表示模糊的算法. 找工程档案管理软件

财务软件版1楼: 大家都知道,在windows里面查找可以使用*号来模糊某个条件,本人就有了一个想法,
例如:
查找关键字:f*k
就可以找到:fuck和fook等等,以f开头,以k结尾的.

当然,我只是举一个例子,这种查询要灵活,不限于f*k这种格式,还可以用*uc*查找中间含有uc字符的.

相信这个问题没那么简单,大家涌跃讨论一下....

2楼: 构造正则表达式 如饭店管理软件下载

3楼: to:kgm
在下愚钝,麻烦你明示.

4楼: 你的意思就是用通配符吗???SQL语言里面可以用的撒。"%"啊

5楼: to:1020ace
关键我不是用来查询数据库.或许是一个列表,或许是一个文件名.当然不能用SQL语句.

6楼: 那就要用字符串的匹配算法咯...
看看数据结构的书看看..看看这里面,也许对你有帮助..
http://www.jwxf.com/abook/data/

财务软件版7楼: 哎,问了一下午,还是自已写了一个...贴出来给大家,没准会有用.这分我谁也不给...哼.


function FuzzyCompare(OriginalText: string;FuzzyText: string): boolean;
var
FuzzyTextObj :TStringList;
Fuzzy_Text:string;
Original_Text:String;
i :integer;
Middleindex :integer;
Textbegin:string;
TextMiddle:string;
TextEnd:string;
begin
Result := False;
FuzzyTextObj := TStringList.Create;
Original_Text := OriginalText;
Fuzzy_Text := FuzzyText;
if pos(''*'',Fuzzy_Text) <> 0 then
begin
Fuzzy_Text := Del_TwinsStr(Fuzzy_Text,''*'');
FuzzyTextObj := AnalyzeStr(FuzzyText,''*'');
Textbegin := copy(Original_Text,1,Length(FuzzyTextObj[0]));
TextEnd := copy(Original_Text,(Length(Original_Text)-Length(FuzzyTextObj[FuzzyTextObj.Count-1]))+1,Length(FuzzyTextObj[FuzzyTextObj.Count-1]));
TextMiddle := copy(Original_Text,length(Textbegin)+1,(Length(Original_Text)-Length(TextBegin)-Length(TextEnd)));



if FuzzyTextObj[0] <> '''' then
begin
if Textbegin <> FuzzyTextObj[0] then
begin
exit;
end;
end;



if FuzzyTextObj[FuzzyTextObj.Count-1] <> '''' then


begin
if TextEnd <> FuzzyTextObj[FuzzyTextObj.Count-1] then
begin
Exit;
end;
end;




if FuzzyTextObj.Count > 2 then
begin
for i:=1 to FuzzyTextObj.Count-2 do
begin
if FuzzyTextObj[i] <> '''' then
begin
Middleindex := pos(FuzzyTextObj[i],TextMiddle);
if Middleindex = 0 then
begin
exit;
end else
begin
Delete(TextMiddle,1,Middleindex+Length(FuzzyTextObj[i])-1);
end;
end;
end;
end;


end;

Result := True;
end;

8楼: 正则表达式就行了,
RegEx := TRegExpr.Create;
RegEx.Expression := ''f.*k'';
if RegEx.Exec(''fuck'') then
ShowMessage(RegEx.Match[0]);

9楼: 对,正则表达式是最好的方法了





经典正则表达式

正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'''')" onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^\u4E00-\u9FA5]/g,''''))"

用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'''')" onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^\uFF00-\uFFFF]/g,''''))"

用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'''') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^\d]/g,''''))"

用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'''') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^\d]/g,''''))"

10楼: to:Beyondbill

这位兄弟,你要回复也早点哇...害我一下午在那里狂写.都快写死在电脑前面了.

还有,你那个TRegExpr是调用哪个单元的啊.

11楼: 真是瘦田没人耕,耕开有人争,今天我顶了一下午,就是没人提出这么详细的解决方案,等我把傻瓜函数都写好了吧,你们就让我文思如泉涌.....

12楼: http://www.delphifans.com/SoftView/SoftView_500.html
到这里下载吧 如工程档案管理软件

13楼: 晕 如泉涌。。。。不至于吧,那全过水资源紧张问题不都解决了

这东西绝对用正则表达式,虽然我不会它的规则。。。。不过用脚指头想想也应该想到啊。。。。^_^

财务软件版14楼: 哈哈,同情楼主

15楼: 接受Beyondbill的答案了...其实我写的那个函数也挺好,嘿...当然,Beyondbill提的这个方法让我学会了些东西.至少以后会用到..谢了.