获取指定年份/月份的周六周天 + 标记指定日期(加粗)

本文介绍了一个使用C#编写的程序,该程序能够获取并显示指定年份或月份的所有周末日期(周六和周日)。此外,还提供了如何在月历中突出显示特定日期的方法。

获取指定年份/月份的周末(周六、周天)

using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace KUN.CONTROL
{
    public partial class 获取周末 : Form
    {
        public 获取周末()
        {
            InitializeComponent();
        }

        private void 获取周末_Load(object sender, EventArgs e)
        {
            this.cmbYear.SelectedIndex = 0;
            this.cmbMonth.SelectedIndex = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int year = int.Parse(this.cmbYear.Text);
            if (!this.cmbMonth.Text.Equals("全部"))//获取指定月份的周末--双休哦
            {
                int month = int.Parse(this.cmbMonth.Text);
                string str = NewMethod(year, month);

                this.textBox1.Text = str.ToString();
                int days = int.Parse(this.textBox1.Lines.Count().ToString()) - 1;
                this.textBox2.Text = year + "年" + month + "月,周末有" + days + "天";
            }
            else//获取指定年份的周末--双休哦
            {
                StringBuilder buf = new StringBuilder();
                string str = string.Empty;
                for (int i = 1; i <= 12; i++)
                {
                    str = NewMethod(year, i);
                    buf.Append(str);
                }
                this.textBox1.Text = buf.ToString();
                int days = int.Parse(this.textBox1.Lines.Count().ToString()) - 1;
                this.textBox2.Text = year + "年周末有" + days + "天";
            }
        }

        private string NewMethod(int year, int month)
        {
            // 某年某月的第一天
            DateTime t = new DateTime(year, month, 1);
            StringBuilder buf = new StringBuilder();
            do
            {
                // 星期天为周末
                if (t.DayOfWeek == DayOfWeek.Sunday || t.DayOfWeek == DayOfWeek.Saturday)
                {
                    // 输入周末日期
                    buf.AppendLine(t.ToString("yyyy-MM-dd dddd"));
                }
                t = t.AddDays(1);

            } while (t.Month == month);

            return buf.ToString();
        }
    }
}

运行效果如下:

标记指定日期

  private void button2_Click(object sender, EventArgs e)
        {
            DateTime test= new DateTime(2019, 4, 11);
            monthCalendar1.AddBoldedDate(test);//加粗
            monthCalendar1.BackColor = Color.Red;
            monthCalendar1.UpdateBoldedDates();//重绘粗体格式的日期

            DateTime test1 = new DateTime(2019, 4, 20);
            monthCalendar1.AddBoldedDate(test1);//加粗
            monthCalendar1.BackColor = Color.Red;
            monthCalendar1.UpdateBoldedDates();//重绘粗体格式的日期

            DateTime test2 = new DateTime(2019, 4, 15);
            monthCalendar1.AddBoldedDate(test2);//加粗
            monthCalendar1.BackColor = Color.Red;
            
            monthCalendar1.UpdateBoldedDates();//重绘粗体格式的日期
        }

运行效果如下:

 

转载于:https://www.cnblogs.com/YYkun/p/10689161.html

功能说明 数据导入:支持拖放或点击上传Excel文件,显示文件名称,以百分比显示导入进度,含有清空当前文件的按钮,导入成功,不需要弹确认窗口; 时间轴: 1.生成时间轴按钮,根据Excel数据生成时间轴,要美观简洁大方,百分比显示生成进度; 2.事件在时间轴两侧分布,事件的范围不能超过时间轴,时间轴上有与事件的连接显示; 3.生成事件序号及总数,相邻事件的背景色不同,轻颜色为主,时间轴通过序号排序,显示总事件数量及时间范围,序号显示在该事件的右上角,注意不要与其他信息重合; 4.时间轴可以按年份月份显示对应的事件数量。可以选择同一月份,合并事件,同一年份合并事件; 5.时间轴上相邻两项信息间隔紧凑; 6.可以根据表格中D列的内容筛选,可选择是否将含有筛选项的事件显示在时间轴上,支持多选、全选,显示各项的数量; 7.时间轴通过序号排序,显示总事件数量及时间范围,序号显示在该事件的右上角,注意不要与其他信息重合; 高级设置: 1.所有设置项均放在高级设置里; 2.设置时间轴颜色和时间轴的宽度,页面为白色,相邻时间轴上的2个事件背景色不同; 3.根据表格列名称设置筛选项,含有选中的项整个事件隐藏,不显示在时间轴上; 4.日期格式,自动转换表格中的日期格式,能成功展示在时间轴上; 5.可以设置显示内容是在时间轴同一侧还是两侧交替显示,两侧显示时,事件尺寸不能超过时间轴; 6.可以清空当前日志和清空时间轴; 7.时间轴上可以设置相邻事件的间距,将相邻事件紧凑 8.是否在时间轴显示excel各列的内容,默认都是显示,此项变化时,自动更新时间轴,增加时间轴内事件序号是否显示的设置,增加时间轴内,excel列名称是否显示的设置; 日期处理:正确显示Excel中的日期格式,时间轴的生成按照获取到的时间排序; 日志功能:记录所有关键操作,及错误信息,错误信息加粗及颜色标注,支持导出日志文件 视图控制:可以隐藏控制面板,专注查看时间轴,使用小型切换按钮,图标要小,不影响查看时间轴; 名称:可修改时间轴的名称 页面布局: 1.控制面板紧凑,简洁,突出重点,时间轴美观简洁大方醒目,具有较高审美水平; 2.生成时间轴的内容需要根据Excel列名称确定,不要模拟数据; 3.时间轴美观简洁大方醒目,具有较高审美水平; 4.对于事件描述中的数字加粗及不同颜色标识突出,但是注意颜色搭配,不要出现不易观看的颜色; 5.适应屏幕尺寸 进度显示:所有进度显示都要有百分比
08-23
<think> 我们将在原函数中添加一个新的替换规则,用于将 **文本** 替换为 <strong>文本</strong> 注意:原函数中已经有一个使用星号进行替换的规则(.replace(/^*(.+)$/gm, '<strong>$1</strong>')),但这条规则是针对行首的星号(可能是用于列表或加粗)。现在我们要处理的是用两个星号包裹的文本(**text**)的加粗。 由于原函数中已经有一个使用单星号的行首替换,我们要注意两者不要冲突。因此,我们将先处理双星号的加粗(因为双星号包裹的加粗可能出现在行中任意位置),然后再处理其他规则。 另外,为了避免将单星号的行首匹配误认为是双星号的一部分,我们可以调整顺序,先处理双星号,再处理行首的单星号。但是,原函数中的行首单星号规则(/^*(.+)$/gm)是用来匹配整行以星号开头的行,而双星号规则是用来匹配行内的双星号包裹的文本。 因此,我们可以这样做: 1. 添加一个替换规则:将 **内容** 替换为 <strong>内容</strong> 正则表达式:/\*\*(.+?)\*\*/g 注意:使用非贪婪匹配(.+?)避免匹配多个双星号之间的内容。 2. 将这条规则插入到替换链中。考虑到替换的顺序,我们应该在行级元素(如标题)替换之后,行内元素替换之前进行。但实际上,由于双星号是行内元素,我们可以在任何不影响其他行级元素替换的位置进行,但为了避免被其他替换破坏双星号的模式,我们可以在去除脚注标记(\[\^\d+])之后,换行符替换之前进行。 但是,注意原函数中有一个.replace(/^*(.+)$/gm, '<strong>$1</strong>'),这个规则会匹配整行,所以如果我们先处理双星号,那么被双星号包裹的内容已经被替换了,不会影响到行首星号的匹配(因为行首星号规则要求整行都是星号开头,而双星号替换后,行首可能不再是星号)。 因此,我们可以在原函数的行首星号规则之前或之后添加双星号规则?实际上,双星号规则和行首星号规则针对的是不同的模式,所以顺序影响不大。但是为了安全,我们可以在行首星号规则之前添加双星号规则。 修改后的函数: function changeText(text) { return text .replace(/^###(.+)$/gm, '<h3>$1</h3>') // 三级标题 .replace(/^##(.+)$/gm, '<h2>$1</h2>') // 二级标题 .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>') // 双星号加粗 .replace(/^*(.+)$/gm, '<strong>$1</strong>') // 行首星号(整行加粗?) .replace(/\[\^\d+]/g, '') // 去除脚注标记 .replace(/\n/g, '<br>') // 换行 } 但是,注意原函数中的行首星号规则(/^*(.+)$/gm)可能会匹配到任意行首的星号,包括无序列表的项(通常用星号作为列表标记)。如果我们的文本中有无序列表,那么这条规则会将整个列表项变成加粗。这可能不是我们想要的效果。 所以,我们需要明确: - 双星号 **text** 是用于行内加粗。 - 行首的星号可能是用于列表,但我们之前的设计是将其转换为加粗。这实际上是Markdown中加粗的另一种写法吗?在Markdown中,行首的星号通常表示列表,而加粗是在行内用两个星号包裹。 因此,我们可能需要重新考虑行首星号规则。如果用户确实需要将行首星号的一整行转换为加粗,那么保留;如果不是,那么可能需要移除。 根据用户最初的需求,我们只要求添加双星号加粗。所以我们可以保留原函数的所有规则,并添加双星号规则。 但是,为了避免混淆,我们可以注释掉原函数中的行首星号规则(/^*(.+)$/gm),因为现在有了双星号规则,行首星号规则可能不再需要。或者,我们可以修改行首星号规则,使其仅匹配以星号开头且后面紧跟着非空白字符的行(类似于列表项),然后转换为列表标签?但原函数没有要求列表转换。 由于问题描述中并没有要求处理无序列表,而且原函数中已经存在行首星号规则,我们假设用户确实需要将行首星号的一行转换为加粗。所以我们保留它。 因此,按照上述修改,我们添加了双星号规则。 但是,还有一个问题:双星号规则可能会匹配到一些我们不想匹配的情况,比如在代码块中。但原函数没有处理代码块,所以暂时不考虑。 另外,双星号规则中我们使用了非贪婪匹配(.+?),这样可以避免匹配多个双星号之间的内容时跨越多个双星号对。 示例: 输入:'这是一个**加粗**的例子' 输出:'这是一个<strong>加粗</strong>的例子' 但是,如果文本中有嵌套的双星号,比如:'**外层**内层**文本**',非贪婪匹配会先匹配第一个双星号对,然后匹配第二个,不会尝试匹配整个字符串。所以会变成: <strong>外层</strong>内层<strong>文本</strong> 这通常是我们期望的。 所以,最终的函数如下: </think> ### 在 `changeText()` 函数中添加双星号加粗功能 以下是修改后的代码实现,添加了 `** **` 内容的加粗处理: ```javascript function changeText(text) { return text .replace(/^###(.+)$/gm, '<h3>$1</h3>') // 三级标题 .replace(/^##(.+)$/gm, '<h2>$1</h2>') // 二级标题 .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>') // 双星号加粗(新增) .replace(/^*(.+)$/gm, '<strong>$1</strong>') // 保留原单星号整行加粗 .replace(/\[\^\d+]/g, '') // 移除脚注标记 .replace(/\n/g, '<br>') // 换行符转换 } ``` ### 关键修改说明: 1. **添加双星号加粗处理**: ```javascript .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>') ``` - 正则说明:`/\*\*(.*?)\*\*/g` - `\*\*` → 匹配开始双星号 `**` - `(.*?)` → 非贪婪匹配任意内容(含换行) - `\*\*` → 匹配结束双星号 `**` - 使用 `$1` 捕获组保留原始内容 2. **保留原有单星号整行加粗**: ```javascript .replace(/^*(.+)$/gm, '<strong>$1</strong>') ``` 确保原有功能不变(整行以星号开头的加粗) ### 功能演示: ```javascript const input = "标题\n## 二级标题\n这是**加粗文本**示例\n*整行加粗内容"; console.log(changeText(input)); ``` 输出结果: ```html 标题<br> <h2>二级标题</h2><br> 这是<strong>加粗文本</strong>示例<br> <strong>整行加粗内容</strong> ``` ### 注意事项: 1. **匹配优先级**: - 从上到下顺序执行 - 标题匹配优先于加粗处理 - 双星号加粗优先于单星号整行加粗 2. **特殊符号转义**: 若文本需显示真实星号,需转义: ```javascript const text = "显示星号: \\*\\*正常文本\\*\\*"; ``` 3. **嵌套处理限制**: 当前正则不支持嵌套格式(如`**外层**内层**文本**`),复杂场景需改用解析器[^1] ### 相关问题: 1. 如何处理**嵌套格式**(如加粗中包含斜体)?[^1] 2. 如何实现**多级标题**(H4-H6)的支持? 3. 在**实时编辑场景**中如何优化正则替换性能?[^2] 4. 如何防止正则表达式中的**ReDoS攻击**?[^4] 5. 有哪些替代方案可以处理**复杂Markdown语法**?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值